sqlglot 30.18.0__tar.gz → 30.20.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.18.0 → sqlglot-30.20.0}/.gitignore +1 -0
  2. {sqlglot-30.18.0 → sqlglot-30.20.0}/CHANGELOG.md +437 -0
  3. {sqlglot-30.18.0 → sqlglot-30.20.0}/Makefile +1 -1
  4. {sqlglot-30.18.0/sqlglot.egg-info → sqlglot-30.20.0}/PKG-INFO +3 -3
  5. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/_version.py +3 -3
  6. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/dialect.py +1 -4
  7. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/mysql.py +1 -0
  8. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/sqlite.py +2 -0
  9. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/starrocks.py +1 -0
  10. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/executor/env.py +6 -0
  11. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/expressions/__init__.py +3 -0
  12. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/expressions/aggregate.py +6 -0
  13. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/expressions/array.py +6 -1
  14. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/expressions/core.py +4 -0
  15. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/expressions/json.py +5 -1
  16. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/expressions/query.py +20 -5
  17. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/expressions/string.py +1 -0
  18. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generator.py +30 -16
  19. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/bigquery.py +5 -0
  20. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/clickhouse.py +10 -0
  21. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/databricks.py +1 -1
  22. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/doris.py +15 -0
  23. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/duckdb.py +19 -17
  24. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/fabric.py +5 -5
  25. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/mysql.py +14 -4
  26. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/python.py +10 -1
  27. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/singlestore.py +11 -0
  28. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/spark.py +3 -0
  29. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/sqlite.py +65 -31
  30. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/starrocks.py +19 -0
  31. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/teradata.py +1 -0
  32. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/trino.py +41 -0
  33. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/tsql.py +61 -3
  34. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/lineage.py +1 -1
  35. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/annotate_types.py +5 -4
  36. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/canonicalize_internal_names.py +4 -4
  37. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/eliminate_subqueries.py +3 -1
  38. sqlglot-30.20.0/sqlglot/optimizer/helpers.py +49 -0
  39. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/journal.py +4 -4
  40. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/merge_subqueries.py +90 -14
  41. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/pushdown_predicates.py +9 -1
  42. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/pushdown_projections.py +148 -50
  43. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/qualify_columns.py +61 -13
  44. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/resolver.py +23 -7
  45. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/scope.py +27 -21
  46. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/simplify.py +77 -44
  47. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/unnest_subqueries.py +118 -37
  48. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parser.py +71 -43
  49. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/bigquery.py +0 -6
  50. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/clickhouse.py +9 -6
  51. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/hive.py +6 -0
  52. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/mysql.py +53 -7
  53. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/redshift.py +2 -0
  54. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/snowflake.py +7 -2
  55. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/sqlite.py +5 -0
  56. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/teradata.py +2 -1
  57. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/trino.py +0 -6
  58. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/tsql.py +2 -2
  59. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/planner.py +58 -18
  60. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/transforms.py +8 -4
  61. sqlglot-30.20.0/sqlglot/typing/duckdb.py +118 -0
  62. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/typing/postgres.py +1 -0
  63. {sqlglot-30.18.0 → sqlglot-30.20.0/sqlglot.egg-info}/PKG-INFO +3 -3
  64. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot.egg-info/SOURCES.txt +1 -0
  65. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot.egg-info/requires.txt +2 -2
  66. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot.egg-info/scm_file_list.json +1 -0
  67. sqlglot-30.20.0/sqlglot.egg-info/scm_version.json +8 -0
  68. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_bigquery.py +30 -6
  69. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_clickhouse.py +57 -0
  70. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_databricks.py +6 -0
  71. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_dialect.py +54 -1
  72. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_doris.py +29 -0
  73. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_duckdb.py +57 -0
  74. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_fabric.py +15 -5
  75. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_mysql.py +106 -5
  76. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_postgres.py +4 -0
  77. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_presto.py +3 -9
  78. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_redshift.py +3 -0
  79. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_singlestore.py +28 -1
  80. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_snowflake.py +87 -5
  81. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_spark.py +21 -6
  82. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_sqlite.py +188 -10
  83. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_starrocks.py +30 -0
  84. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_trino.py +122 -1
  85. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_tsql.py +236 -4
  86. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/annotate_functions.sql +27 -0
  87. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/annotate_types.sql +28 -0
  88. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/merge_subqueries.sql +4 -0
  89. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/optimizer.sql +2 -1
  90. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/pushdown_predicates.sql +8 -2
  91. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/pushdown_projections.sql +25 -0
  92. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/qualify_columns.sql +3 -0
  93. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/simplify.sql +296 -24
  94. sqlglot-30.20.0/tests/fixtures/optimizer/unnest_subqueries.sql +297 -0
  95. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/helpers.py +4 -0
  96. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/leakcheck.py +5 -3
  97. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_executor.py +223 -0
  98. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_expressions.py +12 -0
  99. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_generator.py +2 -1
  100. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_jsonpath.py +2 -1
  101. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_optimizer.py +95 -9
  102. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_parser.py +27 -0
  103. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_serde.py +2 -2
  104. sqlglot-30.18.0/sqlglot/typing/duckdb.py +0 -64
  105. sqlglot-30.18.0/sqlglot.egg-info/scm_version.json +0 -8
  106. sqlglot-30.18.0/tests/fixtures/optimizer/unnest_subqueries.sql +0 -146
  107. {sqlglot-30.18.0 → sqlglot-30.20.0}/.gitmodules +0 -0
  108. {sqlglot-30.18.0 → sqlglot-30.20.0}/.gitpod.yml +0 -0
  109. {sqlglot-30.18.0 → sqlglot-30.20.0}/.pre-commit-config.yaml +0 -0
  110. {sqlglot-30.18.0 → sqlglot-30.20.0}/AGENTS.md +0 -0
  111. {sqlglot-30.18.0 → sqlglot-30.20.0}/CLAUDE.md +0 -0
  112. {sqlglot-30.18.0 → sqlglot-30.20.0}/CONTRIBUTING.md +0 -0
  113. {sqlglot-30.18.0 → sqlglot-30.20.0}/LICENSE +0 -0
  114. {sqlglot-30.18.0 → sqlglot-30.20.0}/MANIFEST.in +0 -0
  115. {sqlglot-30.18.0 → sqlglot-30.20.0}/README.md +0 -0
  116. {sqlglot-30.18.0 → sqlglot-30.20.0}/pyproject.toml +0 -0
  117. {sqlglot-30.18.0 → sqlglot-30.20.0}/setup.cfg +0 -0
  118. {sqlglot-30.18.0 → sqlglot-30.20.0}/setup.py +0 -0
  119. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/__init__.py +0 -0
  120. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/__main__.py +0 -0
  121. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/_typing.py +0 -0
  122. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/anonymize.py +0 -0
  123. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/__init__.py +0 -0
  124. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/athena.py +0 -0
  125. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/bigquery.py +0 -0
  126. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/clickhouse.py +0 -0
  127. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/databricks.py +0 -0
  128. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/dax.py +0 -0
  129. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/doris.py +0 -0
  130. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/dremio.py +0 -0
  131. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/drill.py +0 -0
  132. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/druid.py +0 -0
  133. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/duckdb.py +0 -0
  134. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/dune.py +0 -0
  135. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/exasol.py +0 -0
  136. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/fabric.py +0 -0
  137. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/hive.py +0 -0
  138. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/materialize.py +0 -0
  139. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/oracle.py +0 -0
  140. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/postgres.py +0 -0
  141. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/presto.py +0 -0
  142. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/prql.py +0 -0
  143. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/redshift.py +0 -0
  144. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/risingwave.py +0 -0
  145. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/singlestore.py +0 -0
  146. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/snowflake.py +0 -0
  147. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/solr.py +0 -0
  148. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/spark.py +0 -0
  149. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/spark2.py +0 -0
  150. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/tableau.py +0 -0
  151. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/teradata.py +0 -0
  152. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/trino.py +0 -0
  153. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/dialects/tsql.py +0 -0
  154. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/diff.py +0 -0
  155. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/errors.py +0 -0
  156. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/executor/__init__.py +0 -0
  157. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/executor/context.py +0 -0
  158. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/executor/python.py +0 -0
  159. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/executor/table.py +0 -0
  160. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/expressions/builders.py +0 -0
  161. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/expressions/constraints.py +0 -0
  162. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/expressions/datatypes.py +0 -0
  163. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/expressions/ddl.py +0 -0
  164. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/expressions/dml.py +0 -0
  165. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/expressions/functions.py +0 -0
  166. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/expressions/math.py +0 -0
  167. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/expressions/properties.py +0 -0
  168. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/expressions/temporal.py +0 -0
  169. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/__init__.py +0 -0
  170. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/athena.py +0 -0
  171. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/dax.py +0 -0
  172. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/dremio.py +0 -0
  173. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/drill.py +0 -0
  174. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/druid.py +0 -0
  175. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/dune.py +0 -0
  176. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/exasol.py +0 -0
  177. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/hive.py +0 -0
  178. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/materialize.py +0 -0
  179. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/oracle.py +0 -0
  180. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/postgres.py +0 -0
  181. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/presto.py +0 -0
  182. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/prql.py +0 -0
  183. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/redshift.py +0 -0
  184. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/risingwave.py +0 -0
  185. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/snowflake.py +0 -0
  186. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/solr.py +0 -0
  187. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/spark2.py +0 -0
  188. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/generators/tableau.py +0 -0
  189. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/helper.py +0 -0
  190. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/jsonpath.py +0 -0
  191. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/__init__.py +0 -0
  192. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/canonicalize.py +0 -0
  193. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
  194. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
  195. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  196. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/normalize.py +0 -0
  197. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  198. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/optimize_joins.py +0 -0
  199. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/optimizer.py +0 -0
  200. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/qualify.py +0 -0
  201. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/optimizer/qualify_tables.py +0 -0
  202. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/__init__.py +0 -0
  203. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/athena.py +0 -0
  204. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/base.py +0 -0
  205. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/databricks.py +0 -0
  206. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/dax.py +0 -0
  207. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/doris.py +0 -0
  208. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/dremio.py +0 -0
  209. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/drill.py +0 -0
  210. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/druid.py +0 -0
  211. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/duckdb.py +0 -0
  212. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/dune.py +0 -0
  213. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/exasol.py +0 -0
  214. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/fabric.py +0 -0
  215. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/materialize.py +0 -0
  216. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/oracle.py +0 -0
  217. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/postgres.py +0 -0
  218. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/presto.py +0 -0
  219. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/prql.py +0 -0
  220. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/risingwave.py +0 -0
  221. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/singlestore.py +0 -0
  222. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/solr.py +0 -0
  223. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/spark.py +0 -0
  224. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/spark2.py +0 -0
  225. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/starrocks.py +0 -0
  226. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/parsers/tableau.py +0 -0
  227. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/py.typed +0 -0
  228. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/schema.py +0 -0
  229. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/serde.py +0 -0
  230. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/time.py +0 -0
  231. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/tokenizer_core.py +0 -0
  232. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/tokens.py +0 -0
  233. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/trie.py +0 -0
  234. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/typing/__init__.py +0 -0
  235. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/typing/bigquery.py +0 -0
  236. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/typing/clickhouse.py +0 -0
  237. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/typing/databricks.py +0 -0
  238. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/typing/hive.py +0 -0
  239. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/typing/mysql.py +0 -0
  240. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/typing/presto.py +0 -0
  241. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/typing/redshift.py +0 -0
  242. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/typing/snowflake.py +0 -0
  243. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/typing/spark.py +0 -0
  244. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/typing/spark2.py +0 -0
  245. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot/typing/tsql.py +0 -0
  246. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot.egg-info/dependency_links.txt +0 -0
  247. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot.egg-info/top_level.txt +0 -0
  248. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglot.png +0 -0
  249. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglotc/MANIFEST.in +0 -0
  250. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglotc/pyproject.toml +0 -0
  251. {sqlglot-30.18.0 → sqlglot-30.20.0}/sqlglotc/setup.py +0 -0
  252. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/__init__.py +0 -0
  253. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/__init__.py +0 -0
  254. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_athena.py +0 -0
  255. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_dax.py +0 -0
  256. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_dremio.py +0 -0
  257. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_drill.py +0 -0
  258. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_druid.py +0 -0
  259. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_dune.py +0 -0
  260. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_exasol.py +0 -0
  261. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_hive.py +0 -0
  262. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_materialize.py +0 -0
  263. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_oracle.py +0 -0
  264. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_pipe_syntax.py +0 -0
  265. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_prql.py +0 -0
  266. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_risingwave.py +0 -0
  267. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_solr.py +0 -0
  268. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_tableau.py +0 -0
  269. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/dialects/test_teradata.py +0 -0
  270. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/identity.sql +0 -0
  271. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/jsonpath/LICENSE +0 -0
  272. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/jsonpath/cts.json +0 -0
  273. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
  274. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/canonicalize_internal_names.sql +0 -0
  275. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
  276. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
  277. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
  278. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
  279. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/normalize.sql +0 -0
  280. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
  281. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
  282. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
  283. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
  284. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
  285. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
  286. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
  287. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
  288. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
  289. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
  290. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
  291. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
  292. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
  293. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
  294. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
  295. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
  296. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
  297. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
  298. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
  299. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
  300. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
  301. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
  302. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
  303. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
  304. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
  305. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
  306. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
  307. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
  308. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
  309. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
  310. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
  311. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
  312. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
  313. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
  314. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
  315. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
  316. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
  317. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
  318. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
  319. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
  320. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
  321. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
  322. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/partial.sql +0 -0
  323. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/fixtures/pretty.sql +0 -0
  324. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/gen_fixtures.py +0 -0
  325. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/sqlglot/__init__.py +0 -0
  326. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_anonymize.py +0 -0
  327. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_build.py +0 -0
  328. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_dialect_entry_points.py +0 -0
  329. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_dialect_imports.py +0 -0
  330. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_diff.py +0 -0
  331. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_docs.py +0 -0
  332. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_errors.py +0 -0
  333. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_helper.py +0 -0
  334. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_integration_loader.py +0 -0
  335. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_lineage.py +0 -0
  336. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_schema.py +0 -0
  337. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_time.py +0 -0
  338. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_tokens.py +0 -0
  339. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_transforms.py +0 -0
  340. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_transpile.py +0 -0
  341. {sqlglot-30.18.0 → sqlglot-30.20.0}/tests/test_typing.py +0 -0
@@ -5,6 +5,7 @@ __pycache__/
5
5
 
6
6
  # C extensions
7
7
  *.so
8
+ *.pyd
8
9
 
9
10
  # Distribution / packaging
10
11
  .Python
@@ -1,6 +1,441 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ ## [v30.19.0] - 2026-09-22
5
+ ### :boom: BREAKING CHANGES
6
+ - due to [`bbb717e`](https://github.com/tobymao/sqlglot/commit/bbb717ebb24c8dcbee94d77c9154e74da1dc6c10) - rename union scope type to set operation for consistency *(PR [#8306](https://github.com/tobymao/sqlglot/pull/8306) by [@georgesittas](https://github.com/georgesittas))*:
7
+
8
+ rename union scope type to set operation for consistency (#8306)
9
+
10
+ - due to [`d7dd2cd`](https://github.com/tobymao/sqlglot/commit/d7dd2cd18fd214892136b4d0706cd65d348da285) - annotate function replace for postgres *(PR [#8307](https://github.com/tobymao/sqlglot/pull/8307) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*:
11
+
12
+ annotate function replace for postgres (#8307)
13
+
14
+ - due to [`9794193`](https://github.com/tobymao/sqlglot/commit/97941935711779438b34e11edbed6a736d2ad0c6) - preserve the order of CUBE, ROLLUP and GROUPING SETS in GROUP BY *(PR [#8312](https://github.com/tobymao/sqlglot/pull/8312) by [@georgesittas](https://github.com/georgesittas))*:
15
+
16
+ preserve the order of CUBE, ROLLUP and GROUPING SETS in GROUP BY (#8312)
17
+
18
+ - due to [`8bf484c`](https://github.com/tobymao/sqlglot/commit/8bf484ce23ad684430675d60fcd82c05a957e4db) - Fix the json path with single quote issue *(PR [#8309](https://github.com/tobymao/sqlglot/pull/8309) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
19
+
20
+ Fix the json path with single quote issue (#8309)
21
+
22
+ - due to [`1d753d7`](https://github.com/tobymao/sqlglot/commit/1d753d72c6e81e39cfc7160af33673314d4d600e) - EXISTS over a scalar aggregate is always true [CLAUDE] *(PR [#8304](https://github.com/tobymao/sqlglot/pull/8304) by [@jbylund](https://github.com/jbylund))*:
23
+
24
+ EXISTS over a scalar aggregate is always true [CLAUDE] (#8304)
25
+
26
+ - due to [`106ad25`](https://github.com/tobymao/sqlglot/commit/106ad25d3500f479144a24f3130c8a45a1d547b0) - decorrelation when non-EQ keys are present *(PR [#8317](https://github.com/tobymao/sqlglot/pull/8317) by [@georgesittas](https://github.com/georgesittas))*:
27
+
28
+ decorrelation when non-EQ keys are present (#8317)
29
+
30
+ - due to [`0d88a21`](https://github.com/tobymao/sqlglot/commit/0d88a211de50fa118e7e7185665d2f31310fceaa) - don't fan out EXISTS decorrelation over grouped subqueries *(PR [#8318](https://github.com/tobymao/sqlglot/pull/8318) by [@georgesittas](https://github.com/georgesittas))*:
31
+
32
+ don't fan out EXISTS decorrelation over grouped subqueries (#8318)
33
+
34
+ - due to [`0714112`](https://github.com/tobymao/sqlglot/commit/0714112aa814778ff371cc33a9441548ae6b924c) - only propagate constants through non-nullable columns *(PR [#8326](https://github.com/tobymao/sqlglot/pull/8326) by [@geooo109](https://github.com/geooo109))*:
35
+
36
+ only propagate constants through non-nullable columns (#8326)
37
+
38
+ - due to [`a34fc27`](https://github.com/tobymao/sqlglot/commit/a34fc276539980ee1f3d51e85a17a19f40b3f276) - star referencing outer-scope from correlated subquery *(PR [#8291](https://github.com/tobymao/sqlglot/pull/8291) by [@treysp](https://github.com/treysp))*:
39
+
40
+ star referencing outer-scope from correlated subquery (#8291)
41
+
42
+ - due to [`9f604b3`](https://github.com/tobymao/sqlglot/commit/9f604b3de5967c0107404676690c82e3c3552593) - preserve GREATEST/LEAST NULL semantics *(PR [#8320](https://github.com/tobymao/sqlglot/pull/8320) by [@Kunal8954](https://github.com/Kunal8954))*:
43
+
44
+ preserve GREATEST/LEAST NULL semantics (#8320)
45
+
46
+ - due to [`83abff6`](https://github.com/tobymao/sqlglot/commit/83abff6576cbc3b5858581b8ae9a912dec0f3304) - render a DynamicIdentifier in Table.name [CLAUDE] *(PR [#8329](https://github.com/tobymao/sqlglot/pull/8329) by [@chaitanyaatlan](https://github.com/chaitanyaatlan))*:
47
+
48
+ render a DynamicIdentifier in Table.name [CLAUDE] (#8329)
49
+
50
+ - due to [`9ec72cf`](https://github.com/tobymao/sqlglot/commit/9ec72cf88314ef218face2c587957189ab10a21b) - parse MySQL index prefixes *(PR [#8335](https://github.com/tobymao/sqlglot/pull/8335) by [@burnison](https://github.com/burnison))*:
51
+
52
+ parse MySQL index prefixes (#8335)
53
+
54
+ - due to [`64d6f59`](https://github.com/tobymao/sqlglot/commit/64d6f59a4981d35f362fecc615a4e3ce764bebb7) - for simplify fold contradictory comparisons to FALSE only for non-null columns *(PR [#8338](https://github.com/tobymao/sqlglot/pull/8338) by [@geooo109](https://github.com/geooo109))*:
55
+
56
+ for simplify fold contradictory comparisons to FALSE only for non-null columns (#8338)
57
+
58
+ - due to [`56a66cd`](https://github.com/tobymao/sqlglot/commit/56a66cddf65e83080ae6534824136575bf192274) - avoid to rewrite RIGHT JOIN ... ON TRUE to CROSS JOIN in simplify *(PR [#8340](https://github.com/tobymao/sqlglot/pull/8340) by [@geooo109](https://github.com/geooo109))*:
59
+
60
+ avoid to rewrite RIGHT JOIN ... ON TRUE to CROSS JOIN in simplify (#8340)
61
+
62
+ - due to [`a8719ad`](https://github.com/tobymao/sqlglot/commit/a8719ad6425579b8becd9434b93c9a9f0d28b05e) - preserve columns when source is a whole-row reference *(PR [#8332](https://github.com/tobymao/sqlglot/pull/8332) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*:
63
+
64
+ preserve columns when source is a whole-row reference (#8332)
65
+
66
+ - due to [`5cfb599`](https://github.com/tobymao/sqlglot/commit/5cfb5997a99010940138670adf3d6b34ac5a0a08) - preserve precedence when replacing aliases in predicate pushdown [GLM] *(PR [#8342](https://github.com/tobymao/sqlglot/pull/8342) by [@tobymao](https://github.com/tobymao))*:
67
+
68
+ preserve precedence when replacing aliases in predicate pushdown [GLM] (#8342)
69
+
70
+ - due to [`3ca8248`](https://github.com/tobymao/sqlglot/commit/3ca824895ef423f7895fb13d72357548c0f1f367) - preserve coalesce concat semantics closes [#8343](https://github.com/tobymao/sqlglot/pull/8343) *(commit by [@georgesittas](https://github.com/georgesittas))*:
71
+
72
+ preserve coalesce concat semantics closes #8343
73
+
74
+ - due to [`eee4750`](https://github.com/tobymao/sqlglot/commit/eee4750c47cf15c8a41432b21df26fdaa0a11ead) - preserve UNION ALL arm width when nested set op forces column retention *(PR [#8325](https://github.com/tobymao/sqlglot/pull/8325) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*:
75
+
76
+ preserve UNION ALL arm width when nested set op forces column retention (#8325)
77
+
78
+ - due to [`4b84b4d`](https://github.com/tobymao/sqlglot/commit/4b84b4d4f3e91e4f64721cb72e0590e4de72aa46) - keep scale and length for MONEY, SMALLMONEY, XML and IMAGE [CLAUDE] *(PR [#8362](https://github.com/tobymao/sqlglot/pull/8362) by [@NielsZeilemaker](https://github.com/NielsZeilemaker))*:
79
+
80
+ keep scale and length for MONEY, SMALLMONEY, XML and IMAGE [CLAUDE] (#8362)
81
+
82
+ - due to [`4eb2c99`](https://github.com/tobymao/sqlglot/commit/4eb2c99a150f56c9048a3ddf6c71dded86597362) - transpile json type to varchar(max), similar to xml *(commit by [@georgesittas](https://github.com/georgesittas))*:
83
+
84
+ transpile json type to varchar(max), similar to xml
85
+
86
+ - due to [`d53cbc9`](https://github.com/tobymao/sqlglot/commit/d53cbc988512ee63ca547694c6a1656fd4dbb637) - raise on a duplicate OFFSET instead of overwriting it [CLAUDE] *(PR [#8367](https://github.com/tobymao/sqlglot/pull/8367) by [@jbylund](https://github.com/jbylund))*:
87
+
88
+ raise on a duplicate OFFSET instead of overwriting it [CLAUDE] (#8367)
89
+
90
+ - due to [`4e973f0`](https://github.com/tobymao/sqlglot/commit/4e973f0c0cd426ab2260db291d45a7a207b48356) - honor positional column aliases declared on derived tables and CTEs *(PR [#8382](https://github.com/tobymao/sqlglot/pull/8382) by [@georgesittas](https://github.com/georgesittas))*:
91
+
92
+ honor positional column aliases declared on derived tables and CTEs (#8382)
93
+
94
+ - due to [`539b112`](https://github.com/tobymao/sqlglot/commit/539b1125dbe698145057a58efaff2eb7ae2dfdbd) - get rid of `remove_unused_selections` flag in `pushdown_projections` *(commit by [@georgesittas](https://github.com/georgesittas))*:
95
+
96
+ get rid of `remove_unused_selections` flag in `pushdown_projections`
97
+
98
+ - due to [`f5cb53d`](https://github.com/tobymao/sqlglot/commit/f5cb53d6d06e8dd7e7521b35d7294d7c9fa5d293) - qualify bare right-hand table column ref in SEMI/ANTI join ON *(PR [#8383](https://github.com/tobymao/sqlglot/pull/8383) by [@treysp](https://github.com/treysp))*:
99
+
100
+ qualify bare right-hand table column ref in SEMI/ANTI join ON (#8383)
101
+
102
+ - due to [`901a678`](https://github.com/tobymao/sqlglot/commit/901a67882871b9eb27ad9dfdd23380c0fca4cf1f) - preserve DuckDB DATE_TRUNC return type when simplifying. *(commit by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
103
+
104
+ preserve DuckDB DATE_TRUNC return type when simplifying.
105
+
106
+ - due to [`06c7b3d`](https://github.com/tobymao/sqlglot/commit/06c7b3dd7b656ff5ed80337ee668cf58318e002b) - preserve precedence when collapsing CASE and IF *(PR [#8389](https://github.com/tobymao/sqlglot/pull/8389) by [@georgesittas](https://github.com/georgesittas))*:
107
+
108
+ preserve precedence when collapsing CASE and IF (#8389)
109
+
110
+ - due to [`9beb769`](https://github.com/tobymao/sqlglot/commit/9beb769dbffdbabc73b4459137ce2be21678765f) - drop TIMESTAMP_LTZ precision [CODEX] *(PR [#8403](https://github.com/tobymao/sqlglot/pull/8403) by [@tekumara](https://github.com/tekumara))*:
111
+
112
+ drop TIMESTAMP_LTZ precision [CODEX] (#8403)
113
+
114
+ - due to [`eeece5a`](https://github.com/tobymao/sqlglot/commit/eeece5a564e2d5c37b73d172843e7cd437406c42) - preserve pagination scope in set operations *(PR [#8385](https://github.com/tobymao/sqlglot/pull/8385) by [@georgesittas](https://github.com/georgesittas))*:
115
+
116
+ preserve pagination scope in set operations (#8385)
117
+
118
+ - due to [`1a782c5`](https://github.com/tobymao/sqlglot/commit/1a782c55a8f2bad4ac9ca7e28b1a1b1164840894) - keep the native IF instead of changing it to CASE [CLAUDE] *(PR [#8409](https://github.com/tobymao/sqlglot/pull/8409) by [@UCHPUCHMAK](https://github.com/UCHPUCHMAK))*:
119
+
120
+ keep the native IF instead of changing it to CASE [CLAUDE] (#8409)
121
+
122
+
123
+ ### :sparkles: New Features
124
+ - [`d7dd2cd`](https://github.com/tobymao/sqlglot/commit/d7dd2cd18fd214892136b4d0706cd65d348da285) - **optimizer**: annotate function replace for postgres *(PR [#8307](https://github.com/tobymao/sqlglot/pull/8307) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*
125
+ - [`3f154bf`](https://github.com/tobymao/sqlglot/commit/3f154bfb65ad77b2e2b71375692aee9a69f2d8da) - **mysql**: add `ALTER ... COMMENT`. *(PR [#8310](https://github.com/tobymao/sqlglot/pull/8310) by [@burnison](https://github.com/burnison))*
126
+ - [`8bf484c`](https://github.com/tobymao/sqlglot/commit/8bf484ce23ad684430675d60fcd82c05a957e4db) - **generator**: Fix the json path with single quote issue *(PR [#8309](https://github.com/tobymao/sqlglot/pull/8309) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
127
+ - :arrow_lower_right: *addresses issue [#8251](https://github.com/tobymao/sqlglot/issues/8251) opened by [@RogerHYang](https://github.com/RogerHYang)*
128
+ - [`3d25907`](https://github.com/tobymao/sqlglot/commit/3d259070d4c892992e9b1b247166d6056e742599) - **executor**: implement FIRST [CLAUDE] *(PR [#8319](https://github.com/tobymao/sqlglot/pull/8319) by [@jbylund](https://github.com/jbylund))*
129
+ - [`90d44b8`](https://github.com/tobymao/sqlglot/commit/90d44b8556a19ddf8d4d43395a39f589a42ab748) - **trino**: preserve Spark CONCAT_WS array semantics *(PR [#8391](https://github.com/tobymao/sqlglot/pull/8391) by [@georgesittas](https://github.com/georgesittas))*
130
+ - :arrow_lower_right: *addresses issue [#8386](https://github.com/tobymao/sqlglot/issues/8386) opened by [@xiaoyu-meng-mxy](https://github.com/xiaoyu-meng-mxy)*
131
+ - [`0256222`](https://github.com/tobymao/sqlglot/commit/02562228357e7d933ef66e27c56e257b88faad8f) - **parser**: supprot AGG *(PR [#8414](https://github.com/tobymao/sqlglot/pull/8414) by [@geooo109](https://github.com/geooo109))*
132
+
133
+ ### :bug: Bug Fixes
134
+ - [`9794193`](https://github.com/tobymao/sqlglot/commit/97941935711779438b34e11edbed6a736d2ad0c6) - **parser**: preserve the order of CUBE, ROLLUP and GROUPING SETS in GROUP BY *(PR [#8312](https://github.com/tobymao/sqlglot/pull/8312) by [@georgesittas](https://github.com/georgesittas))*
135
+ - :arrow_lower_right: *fixes issue [#8311](https://github.com/tobymao/sqlglot/issues/8311) opened by [@wwzhe007](https://github.com/wwzhe007)*
136
+ - [`3086608`](https://github.com/tobymao/sqlglot/commit/3086608e6fd4c41c02dfba47171608d2b193fce2) - **trino**: prefix JSON_QUERY paths with the lax mode specifier *(PR [#8313](https://github.com/tobymao/sqlglot/pull/8313) by [@Kunal8954](https://github.com/Kunal8954))*
137
+ - [`18fc199`](https://github.com/tobymao/sqlglot/commit/18fc199a01f22ef2a62e68560fcb9c589a3e39df) - **optimizer**: keep projections referenced by SORT BY / DISTRIBUTE BY / CLUSTER BY *(PR [#8302](https://github.com/tobymao/sqlglot/pull/8302) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
138
+ - [`1d753d7`](https://github.com/tobymao/sqlglot/commit/1d753d72c6e81e39cfc7160af33673314d4d600e) - **optimizer**: EXISTS over a scalar aggregate is always true [CLAUDE] *(PR [#8304](https://github.com/tobymao/sqlglot/pull/8304) by [@jbylund](https://github.com/jbylund))*
139
+ - [`c9ad903`](https://github.com/tobymao/sqlglot/commit/c9ad903e7553543686472e5babf3c18e4e7dbc7b) - **optimizer**: preserve operand order when simplifying COALESCE comparisons *(PR [#8316](https://github.com/tobymao/sqlglot/pull/8316) by [@geooo109](https://github.com/geooo109))*
140
+ - [`106ad25`](https://github.com/tobymao/sqlglot/commit/106ad25d3500f479144a24f3130c8a45a1d547b0) - **optimizer**: decorrelation when non-EQ keys are present *(PR [#8317](https://github.com/tobymao/sqlglot/pull/8317) by [@georgesittas](https://github.com/georgesittas))*
141
+ - [`0d88a21`](https://github.com/tobymao/sqlglot/commit/0d88a211de50fa118e7e7185665d2f31310fceaa) - **optimizer**: don't fan out EXISTS decorrelation over grouped subqueries *(PR [#8318](https://github.com/tobymao/sqlglot/pull/8318) by [@georgesittas](https://github.com/georgesittas))*
142
+ - [`f22bcdb`](https://github.com/tobymao/sqlglot/commit/f22bcdbad732d9df2c02d37426cbdc27e64b5da6) - **optimizer**: preserve unreferenced UDTF and anonymous-function projections *(PR [#8314](https://github.com/tobymao/sqlglot/pull/8314) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
143
+ - [`0714112`](https://github.com/tobymao/sqlglot/commit/0714112aa814778ff371cc33a9441548ae6b924c) - **optimizer**: only propagate constants through non-nullable columns *(PR [#8326](https://github.com/tobymao/sqlglot/pull/8326) by [@geooo109](https://github.com/geooo109))*
144
+ - [`a34fc27`](https://github.com/tobymao/sqlglot/commit/a34fc276539980ee1f3d51e85a17a19f40b3f276) - **optimizer**: star referencing outer-scope from correlated subquery *(PR [#8291](https://github.com/tobymao/sqlglot/pull/8291) by [@treysp](https://github.com/treysp))*
145
+ - [`faa5ebf`](https://github.com/tobymao/sqlglot/commit/faa5ebf5e7195ea62996d30a1089bf3533731eb2) - **optimizer**: in simplify only move MONTH/YEAR intervals across a comparison when the move is exact *(PR [#8324](https://github.com/tobymao/sqlglot/pull/8324) by [@geooo109](https://github.com/geooo109))*
146
+ - [`9f604b3`](https://github.com/tobymao/sqlglot/commit/9f604b3de5967c0107404676690c82e3c3552593) - **sqlite**: preserve GREATEST/LEAST NULL semantics *(PR [#8320](https://github.com/tobymao/sqlglot/pull/8320) by [@Kunal8954](https://github.com/Kunal8954))*
147
+ - :arrow_lower_right: *fixes issue [#8315](https://github.com/tobymao/sqlglot/issues/8315) opened by [@abinashrasonowal](https://github.com/abinashrasonowal)*
148
+ - [`83abff6`](https://github.com/tobymao/sqlglot/commit/83abff6576cbc3b5858581b8ae9a912dec0f3304) - **expressions**: render a DynamicIdentifier in Table.name [CLAUDE] *(PR [#8329](https://github.com/tobymao/sqlglot/pull/8329) by [@chaitanyaatlan](https://github.com/chaitanyaatlan))*
149
+ - :arrow_lower_right: *fixes issue [#8328](https://github.com/tobymao/sqlglot/issues/8328) opened by [@chaitanyaatlan](https://github.com/chaitanyaatlan)*
150
+ - [`8b374bd`](https://github.com/tobymao/sqlglot/commit/8b374bd525eeade40cef0b02d281e7a9636b974a) - **mysql**: support`UNIQUE` with options *(PR [#8330](https://github.com/tobymao/sqlglot/pull/8330) by [@burnison](https://github.com/burnison))*
151
+ - [`cf8a4db`](https://github.com/tobymao/sqlglot/commit/cf8a4db927c6ce462e2962ddc9546ab4152b8626) - **snowflake**: support ROLLBACK as id var and udf name *(PR [#8334](https://github.com/tobymao/sqlglot/pull/8334) by [@treysp](https://github.com/treysp))*
152
+ - [`9ec72cf`](https://github.com/tobymao/sqlglot/commit/9ec72cf88314ef218face2c587957189ab10a21b) - **mysql**: parse MySQL index prefixes *(PR [#8335](https://github.com/tobymao/sqlglot/pull/8335) by [@burnison](https://github.com/burnison))*
153
+ - [`4559569`](https://github.com/tobymao/sqlglot/commit/45595690cfbacaad486683e019e35c4b6c653786) - **mysql**: drop implicit NULLS FIRST from UNIQUE/INDEX key parts *(commit by [@geooo109](https://github.com/geooo109))*
154
+ - [`70951c7`](https://github.com/tobymao/sqlglot/commit/70951c72dff3fb694040353e8db330756a242a7a) - implement `is_star` iteratively *(PR [#8337](https://github.com/tobymao/sqlglot/pull/8337) by [@georgesittas](https://github.com/georgesittas))*
155
+ - [`64d6f59`](https://github.com/tobymao/sqlglot/commit/64d6f59a4981d35f362fecc615a4e3ce764bebb7) - **optimizer**: for simplify fold contradictory comparisons to FALSE only for non-null columns *(PR [#8338](https://github.com/tobymao/sqlglot/pull/8338) by [@geooo109](https://github.com/geooo109))*
156
+ - [`56a66cd`](https://github.com/tobymao/sqlglot/commit/56a66cddf65e83080ae6534824136575bf192274) - **optimizer**: avoid to rewrite RIGHT JOIN ... ON TRUE to CROSS JOIN in simplify *(PR [#8340](https://github.com/tobymao/sqlglot/pull/8340) by [@geooo109](https://github.com/geooo109))*
157
+ - [`a8719ad`](https://github.com/tobymao/sqlglot/commit/a8719ad6425579b8becd9434b93c9a9f0d28b05e) - **optimizer**: preserve columns when source is a whole-row reference *(PR [#8332](https://github.com/tobymao/sqlglot/pull/8332) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
158
+ - [`5cfb599`](https://github.com/tobymao/sqlglot/commit/5cfb5997a99010940138670adf3d6b34ac5a0a08) - **optimizer**: preserve precedence when replacing aliases in predicate pushdown [GLM] *(PR [#8342](https://github.com/tobymao/sqlglot/pull/8342) by [@tobymao](https://github.com/tobymao))*
159
+ - :arrow_lower_right: *fixes issue [#8341](https://github.com/tobymao/sqlglot/issues/8341) opened by [@xiaoyu-meng-mxy](https://github.com/xiaoyu-meng-mxy)*
160
+ - [`5dea557`](https://github.com/tobymao/sqlglot/commit/5dea557136b0690c280c5c006257f4d681d7f3ce) - **doris**: add 15 missing words to RESERVED_KEYWORDS *(PR [#8357](https://github.com/tobymao/sqlglot/pull/8357) by [@raghav-reglobe](https://github.com/raghav-reglobe))*
161
+ - [`9831daa`](https://github.com/tobymao/sqlglot/commit/9831daa7b785c941ff7c7f90e7640349cec15151) - **sqlite**: correct nanosecond date difference multiplier [COPILOT] *(PR [#8346](https://github.com/tobymao/sqlglot/pull/8346) by [@PhuocOng](https://github.com/PhuocOng))*
162
+ - :arrow_lower_right: *fixes issue [#8345](https://github.com/tobymao/sqlglot/issues/8345) opened by [@PhuocOng](https://github.com/PhuocOng)*
163
+ - [`87d16d0`](https://github.com/tobymao/sqlglot/commit/87d16d022d76e642705681cb6140a544dbde24df) - **singlestore**: ignore nulls in percentile ordering [CODEX] *(PR [#8352](https://github.com/tobymao/sqlglot/pull/8352) by [@joeharris76](https://github.com/joeharris76))*
164
+ - [`e27b765`](https://github.com/tobymao/sqlglot/commit/e27b7654a9d710e29da6f42994de845a99444c84) - **executor**: plan DISTINCT before ORDER BY so the sort survives [CLAUDE] *(PR [#8321](https://github.com/tobymao/sqlglot/pull/8321) by [@jbylund](https://github.com/jbylund))*
165
+ - [`3ca8248`](https://github.com/tobymao/sqlglot/commit/3ca824895ef423f7895fb13d72357548c0f1f367) - **sqlite**: preserve coalesce concat semantics closes [#8343](https://github.com/tobymao/sqlglot/pull/8343) *(commit by [@georgesittas](https://github.com/georgesittas))*
166
+ - [`eee4750`](https://github.com/tobymao/sqlglot/commit/eee4750c47cf15c8a41432b21df26fdaa0a11ead) - **optimizer**: preserve UNION ALL arm width when nested set op forces column retention *(PR [#8325](https://github.com/tobymao/sqlglot/pull/8325) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
167
+ - [`4b84b4d`](https://github.com/tobymao/sqlglot/commit/4b84b4d4f3e91e4f64721cb72e0590e4de72aa46) - **fabric**: keep scale and length for MONEY, SMALLMONEY, XML and IMAGE [CLAUDE] *(PR [#8362](https://github.com/tobymao/sqlglot/pull/8362) by [@NielsZeilemaker](https://github.com/NielsZeilemaker))*
168
+ - [`4eb2c99`](https://github.com/tobymao/sqlglot/commit/4eb2c99a150f56c9048a3ddf6c71dded86597362) - **fabric**: transpile json type to varchar(max), similar to xml *(commit by [@georgesittas](https://github.com/georgesittas))*
169
+ - [`a069a09`](https://github.com/tobymao/sqlglot/commit/a069a0964418188e3822e8bf9238af6b89db0652) - **tsql**: parse FORMAT(x, 'ffffff') as a time format *(commit by [@georgesittas](https://github.com/georgesittas))*
170
+ - [`338bb06`](https://github.com/tobymao/sqlglot/commit/338bb0699385f8a35f76c98954c58b920da679b5) - **sqlite**: evaluate dynamic date-add amounts [COPILOT] *(PR [#8360](https://github.com/tobymao/sqlglot/pull/8360) by [@PhuocOng](https://github.com/PhuocOng))*
171
+ - :arrow_lower_right: *fixes issue [#8359](https://github.com/tobymao/sqlglot/issues/8359) opened by [@PhuocOng](https://github.com/PhuocOng)*
172
+ - [`e946396`](https://github.com/tobymao/sqlglot/commit/e94639635d388cf6b58dd79d643a62082d2305cb) - **optimizer**: preserve COALESCE fallbacks after NULL [CODEX] *(PR [#8364](https://github.com/tobymao/sqlglot/pull/8364) by [@Kuang-xianxin](https://github.com/Kuang-xianxin))*
173
+ - [`d53cbc9`](https://github.com/tobymao/sqlglot/commit/d53cbc988512ee63ca547694c6a1656fd4dbb637) - **parser**: raise on a duplicate OFFSET instead of overwriting it [CLAUDE] *(PR [#8367](https://github.com/tobymao/sqlglot/pull/8367) by [@jbylund](https://github.com/jbylund))*
174
+ - [`fa73693`](https://github.com/tobymao/sqlglot/commit/fa73693547ad5a88ccbbe90fad1196b3153198ed) - **parser**: support OPERATOR as implicit alias *(PR [#8365](https://github.com/tobymao/sqlglot/pull/8365) by [@treysp](https://github.com/treysp))*
175
+ - [`65eb23b`](https://github.com/tobymao/sqlglot/commit/65eb23b53420212c20f394d399ca18efefec90e3) - **spark**: emit SQL function determinism correctly [CODEX] *(PR [#8369](https://github.com/tobymao/sqlglot/pull/8369) by [@jaideeppyne](https://github.com/jaideeppyne))*
176
+ - :arrow_lower_right: *fixes issue [#8368](https://github.com/tobymao/sqlglot/issues/8368) opened by [@EhabEasee](https://github.com/EhabEasee)*
177
+ - [`76004d7`](https://github.com/tobymao/sqlglot/commit/76004d7f33b2365e5e0d66917c18422070fda129) - **sqlite**: emit GROUP_CONCAT ORDER BY instead of dropping it [CODEX] *(PR [#8373](https://github.com/tobymao/sqlglot/pull/8373) by [@jaideeppyne](https://github.com/jaideeppyne))*
178
+ - [`4e973f0`](https://github.com/tobymao/sqlglot/commit/4e973f0c0cd426ab2260db291d45a7a207b48356) - **optimizer**: honor positional column aliases declared on derived tables and CTEs *(PR [#8382](https://github.com/tobymao/sqlglot/pull/8382) by [@georgesittas](https://github.com/georgesittas))*
179
+ - [`f5cb53d`](https://github.com/tobymao/sqlglot/commit/f5cb53d6d06e8dd7e7521b35d7294d7c9fa5d293) - **optimizer**: qualify bare right-hand table column ref in SEMI/ANTI join ON *(PR [#8383](https://github.com/tobymao/sqlglot/pull/8383) by [@treysp](https://github.com/treysp))*
180
+ - [`901a678`](https://github.com/tobymao/sqlglot/commit/901a67882871b9eb27ad9dfdd23380c0fca4cf1f) - **optimizer**: preserve DuckDB DATE_TRUNC return type when simplifying. *(commit by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
181
+ - [`a470787`](https://github.com/tobymao/sqlglot/commit/a470787be21812ba235963c41f23107e3502c00b) - **optimizer**: prevent merge_subqueries from folding set-returning projections *(PR [#8379](https://github.com/tobymao/sqlglot/pull/8379) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
182
+ - [`06c7b3d`](https://github.com/tobymao/sqlglot/commit/06c7b3dd7b656ff5ed80337ee668cf58318e002b) - **optimizer**: preserve precedence when collapsing CASE and IF *(PR [#8389](https://github.com/tobymao/sqlglot/pull/8389) by [@georgesittas](https://github.com/georgesittas))*
183
+ - :arrow_lower_right: *fixes issue [#8380](https://github.com/tobymao/sqlglot/issues/8380) opened by [@Rodrigo-Palma](https://github.com/Rodrigo-Palma)*
184
+ - [`9bc418a`](https://github.com/tobymao/sqlglot/commit/9bc418af0e03220a6eb5289a009bd79328e7cfd1) - **snowflake**: parse unquoted PUT sources as exp.Put [CODEX] *(PR [#8400](https://github.com/tobymao/sqlglot/pull/8400) by [@tekumara](https://github.com/tekumara))*
185
+ - :arrow_lower_right: *fixes issue [#8399](https://github.com/tobymao/sqlglot/issues/8399) opened by [@tekumara](https://github.com/tekumara)*
186
+ - [`9beb769`](https://github.com/tobymao/sqlglot/commit/9beb769dbffdbabc73b4459137ce2be21678765f) - **duckdb**: drop TIMESTAMP_LTZ precision [CODEX] *(PR [#8403](https://github.com/tobymao/sqlglot/pull/8403) by [@tekumara](https://github.com/tekumara))*
187
+ - :arrow_lower_right: *fixes issue [#8402](https://github.com/tobymao/sqlglot/issues/8402) opened by [@tekumara](https://github.com/tekumara)*
188
+ - [`8b6ff93`](https://github.com/tobymao/sqlglot/commit/8b6ff9386ddf4f6f8e3120a21f1991a384e60abd) - **executor**: support DISTINCT calculations CLAUDE *(PR [#8395](https://github.com/tobymao/sqlglot/pull/8395) by [@rubytobi](https://github.com/rubytobi))*
189
+ - [`eeece5a`](https://github.com/tobymao/sqlglot/commit/eeece5a564e2d5c37b73d172843e7cd437406c42) - preserve pagination scope in set operations *(PR [#8385](https://github.com/tobymao/sqlglot/pull/8385) by [@georgesittas](https://github.com/georgesittas))*
190
+ - [`8c3b989`](https://github.com/tobymao/sqlglot/commit/8c3b9893f72f0913fa0a8a4188d55c8cc6692ad5) - **mysql**: SHOW CREATE TABLE generating a syntax error [CLAUDE] *(PR [#8408](https://github.com/tobymao/sqlglot/pull/8408) by [@UCHPUCHMAK](https://github.com/UCHPUCHMAK))*
191
+ - [`1a782c5`](https://github.com/tobymao/sqlglot/commit/1a782c55a8f2bad4ac9ca7e28b1a1b1164840894) - **mysql**: keep the native IF instead of changing it to CASE [CLAUDE] *(PR [#8409](https://github.com/tobymao/sqlglot/pull/8409) by [@UCHPUCHMAK](https://github.com/UCHPUCHMAK))*
192
+
193
+ ### :recycle: Refactors
194
+ - [`bbb717e`](https://github.com/tobymao/sqlglot/commit/bbb717ebb24c8dcbee94d77c9154e74da1dc6c10) - rename union scope type to set operation for consistency *(PR [#8306](https://github.com/tobymao/sqlglot/pull/8306) by [@georgesittas](https://github.com/georgesittas))*
195
+ - [`5fac41e`](https://github.com/tobymao/sqlglot/commit/5fac41edc6d81e9bad5a5d6a64888de4f80ff598) - **optimizer**: skip projection pushdown early *(PR [#8336](https://github.com/tobymao/sqlglot/pull/8336) by [@georgesittas](https://github.com/georgesittas))*
196
+
197
+ ### :white_check_mark: Tests
198
+ - [`1928165`](https://github.com/tobymao/sqlglot/commit/1928165c7d9085b783f8f0c4eec2d6b12fd49a2c) - recognize Windows compiled extensions [COPILOT] *(PR [#8354](https://github.com/tobymao/sqlglot/pull/8354) by [@PhuocOng](https://github.com/PhuocOng))*
199
+ - :arrow_lower_right: *addresses issue [#8353](https://github.com/tobymao/sqlglot/issues/8353) opened by [@PhuocOng](https://github.com/PhuocOng)*
200
+
201
+ ### :wrench: Chores
202
+ - [`9d322b9`](https://github.com/tobymao/sqlglot/commit/9d322b95cffbf09964f4b1b4dcfe0b17813d6b84) - handle `.pyd` suffix (windows builds) *(commit by [@georgesittas](https://github.com/georgesittas))*
203
+ - [`b6aebcd`](https://github.com/tobymao/sqlglot/commit/b6aebcde1f6722142dbd812715cc5db6e5dc54f4) - refactor NOT DETERMINISTIC on base *(PR [#8376](https://github.com/tobymao/sqlglot/pull/8376) by [@geooo109](https://github.com/geooo109))*
204
+ - [`19077cc`](https://github.com/tobymao/sqlglot/commit/19077cc891003183ab2cffe2bd999c83fa7d9168) - sqlite GROUP_CONCAT refactor *(PR [#8377](https://github.com/tobymao/sqlglot/pull/8377) by [@geooo109](https://github.com/geooo109))*
205
+ - [`539b112`](https://github.com/tobymao/sqlglot/commit/539b1125dbe698145057a58efaff2eb7ae2dfdbd) - **optimizer**: get rid of `remove_unused_selections` flag in `pushdown_projections` *(commit by [@georgesittas](https://github.com/georgesittas))*
206
+
207
+
208
+ ## [v30.18.0] - 2026-09-03
209
+ ### :boom: BREAKING CHANGES
210
+ - due to [`8f60665`](https://github.com/tobymao/sqlglot/commit/8f606659077c0380cfbfe2ae53bd43583f41c4cf) - annotate decode for postgres *(PR [#8157](https://github.com/tobymao/sqlglot/pull/8157) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*:
211
+
212
+ annotate decode for postgres (#8157)
213
+
214
+ - due to [`cefce19`](https://github.com/tobymao/sqlglot/commit/cefce19186791442c9995239e1e2bd4931db863a) - map JSONB_CONTAINS to @>, add JSONBContainsTopKey *(PR [#8156](https://github.com/tobymao/sqlglot/pull/8156) by [@georgesittas](https://github.com/georgesittas))*:
215
+
216
+ map JSONB_CONTAINS to @>, add JSONBContainsTopKey (#8156)
217
+
218
+ - due to [`21092b3`](https://github.com/tobymao/sqlglot/commit/21092b3086f0bfba400de98c6deade6f4f6d3de3) - do not normalize identifiers that name data rather than references *(PR [#8161](https://github.com/tobymao/sqlglot/pull/8161) by [@georgesittas](https://github.com/georgesittas))*:
219
+
220
+ do not normalize identifiers that name data rather than references (#8161)
221
+
222
+ - due to [`b4c9ad5`](https://github.com/tobymao/sqlglot/commit/b4c9ad5abcdc8cb76be72876b30881a46077a6c4) - parse BTRIM as TRIM *(PR [#8181](https://github.com/tobymao/sqlglot/pull/8181) by [@jbylund](https://github.com/jbylund))*:
223
+
224
+ parse BTRIM as TRIM (#8181)
225
+
226
+ - due to [`d7ada74`](https://github.com/tobymao/sqlglot/commit/d7ada74e21f33ebeaad0e382b2096460860c5984) - annotate Left function for posrgres *(PR [#8189](https://github.com/tobymao/sqlglot/pull/8189) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*:
227
+
228
+ annotate Left function for posrgres (#8189)
229
+
230
+ - due to [`36785ce`](https://github.com/tobymao/sqlglot/commit/36785ce904ada62355b19e774b1ccd33f145d900) - Annotate Reverse function for Postgres *(PR [#8201](https://github.com/tobymao/sqlglot/pull/8201) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*:
231
+
232
+ Annotate Reverse function for Postgres (#8201)
233
+
234
+ - due to [`cddb7d0`](https://github.com/tobymao/sqlglot/commit/cddb7d03f1f4aa29d2f615dad2c086906e7e5ec1) - annotate Overlay function for Postgres *(PR [#8200](https://github.com/tobymao/sqlglot/pull/8200) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*:
235
+
236
+ annotate Overlay function for Postgres (#8200)
237
+
238
+ - due to [`bb77a11`](https://github.com/tobymao/sqlglot/commit/bb77a117d96265d2732f458fc4e4be23e272d8c1) - Annotate Right function for Postgres *(PR [#8203](https://github.com/tobymao/sqlglot/pull/8203) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*:
239
+
240
+ Annotate Right function for Postgres (#8203)
241
+
242
+ - due to [`0575d38`](https://github.com/tobymao/sqlglot/commit/0575d387603ce7e41068489eec022ffe128ac7c6) - Annotate Rpad function for Postgres *(PR [#8204](https://github.com/tobymao/sqlglot/pull/8204) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*:
243
+
244
+ Annotate Rpad function for Postgres (#8204)
245
+
246
+ - due to [`e674a0e`](https://github.com/tobymao/sqlglot/commit/e674a0e8bae4f06b94eed72e2a781b2df978d983) - Annotate SplitPart function for Postgres *(PR [#8205](https://github.com/tobymao/sqlglot/pull/8205) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*:
247
+
248
+ Annotate SplitPart function for Postgres (#8205)
249
+
250
+ - due to [`585908b`](https://github.com/tobymao/sqlglot/commit/585908b18440149275a0da16e2a7b483b6c34a9b) - Annotate To_Hex function for Postgres *(PR [#8206](https://github.com/tobymao/sqlglot/pull/8206) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*:
251
+
252
+ Annotate To_Hex function for Postgres (#8206)
253
+
254
+ - due to [`542f7b4`](https://github.com/tobymao/sqlglot/commit/542f7b4ae884d6ff7e41a0ddb4f9590de008bc2f) - Annotate Format function for Postgres *(PR [#8207](https://github.com/tobymao/sqlglot/pull/8207) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*:
255
+
256
+ Annotate Format function for Postgres (#8207)
257
+
258
+ - due to [`a580417`](https://github.com/tobymao/sqlglot/commit/a5804178a558acc3a04eacb0057c280c52963ecd) - Annotate Normalize function for Postgres *(PR [#8208](https://github.com/tobymao/sqlglot/pull/8208) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*:
259
+
260
+ Annotate Normalize function for Postgres (#8208)
261
+
262
+ - due to [`2c77cb7`](https://github.com/tobymao/sqlglot/commit/2c77cb7482107082679a10aa0c67a264b1da1fad) - Annotate ToNumber function for Postgres *(PR [#8210](https://github.com/tobymao/sqlglot/pull/8210) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*:
263
+
264
+ Annotate ToNumber function for Postgres (#8210)
265
+
266
+ - due to [`8efda2c`](https://github.com/tobymao/sqlglot/commit/8efda2c6cee394d195ef8ec1856c196228383dc2) - ANALYZE and DROP with multiple tables *(PR [#8229](https://github.com/tobymao/sqlglot/pull/8229) by [@geooo109](https://github.com/geooo109))*:
267
+
268
+ ANALYZE and DROP with multiple tables (#8229)
269
+
270
+ - due to [`e105403`](https://github.com/tobymao/sqlglot/commit/e105403618effd3accb9bb43e93138d2b653b7a1) - annotate maketime for postgres *(PR [#8253](https://github.com/tobymao/sqlglot/pull/8253) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*:
271
+
272
+ annotate maketime for postgres (#8253)
273
+
274
+ - due to [`a3a2a21`](https://github.com/tobymao/sqlglot/commit/a3a2a2178d5f47fa548b5575da6b680bcd95d1c2) - annotate regexpreplace for postgres *(PR [#8256](https://github.com/tobymao/sqlglot/pull/8256) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*:
275
+
276
+ annotate regexpreplace for postgres (#8256)
277
+
278
+ - due to [`79276b6`](https://github.com/tobymao/sqlglot/commit/79276b67d3ae01f97a443df0c20b00da51e87251) - annotate make_timestamp for postgres *(PR [#8258](https://github.com/tobymao/sqlglot/pull/8258) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*:
279
+
280
+ annotate make_timestamp for postgres (#8258)
281
+
282
+ - due to [`f481c22`](https://github.com/tobymao/sqlglot/commit/f481c22bcbd8a453486d1b2a4543e93685b94ce6) - annotate bit_or for postgres *(PR [#8264](https://github.com/tobymao/sqlglot/pull/8264) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*:
283
+
284
+ annotate bit_or for postgres (#8264)
285
+
286
+ - due to [`3762ef4`](https://github.com/tobymao/sqlglot/commit/3762ef4361895ad764a8c3e117132d6a0d1c47df) - Parse MOD at multiplicative precedence *(PR [#8259](https://github.com/tobymao/sqlglot/pull/8259) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
287
+
288
+ Parse MOD at multiplicative precedence (#8259)
289
+
290
+ - due to [`5294204`](https://github.com/tobymao/sqlglot/commit/52942044486ad91d16c93b714e686799591c59d4) - annotate function bit_xor for postgres *(PR [#8274](https://github.com/tobymao/sqlglot/pull/8274) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*:
291
+
292
+ annotate function bit_xor for postgres (#8274)
293
+
294
+ - due to [`9fac05c`](https://github.com/tobymao/sqlglot/commit/9fac05c062f0c9258cee2c72108a14f498f47737) - keep the `COALESCE` wrapping when `CONCAT` is generated as `||` *(PR [#8283](https://github.com/tobymao/sqlglot/pull/8283) by [@ebarkhordar](https://github.com/ebarkhordar))*:
295
+
296
+ keep the `COALESCE` wrapping when `CONCAT` is generated as `||` (#8283)
297
+
298
+ - due to [`2be2afc`](https://github.com/tobymao/sqlglot/commit/2be2afc69fcaeee5bc83ecab555fbdc0a0891b81) - don't push WHERE predicates into sources a later RIGHT or FULL join null-extends [CLAUDE] *(PR [#8282](https://github.com/tobymao/sqlglot/pull/8282) by [@jaideeppyne](https://github.com/jaideeppyne))*:
299
+
300
+ don't push WHERE predicates into sources a later RIGHT or FULL join null-extends [CLAUDE] (#8282)
301
+
302
+ - due to [`b2a1bf5`](https://github.com/tobymao/sqlglot/commit/b2a1bf560ce5c0aafc84995f113f4499b5277e94) - annotate localtimestamp for postgres *(PR [#8295](https://github.com/tobymao/sqlglot/pull/8295) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*:
303
+
304
+ annotate localtimestamp for postgres (#8295)
305
+
306
+ - due to [`f064484`](https://github.com/tobymao/sqlglot/commit/f064484b68547d9c80a9bcecd5e07dd8a056a36b) - normalize DATE_PART unit casing to match EXTRACT [CLAUDE] *(PR [#8293](https://github.com/tobymao/sqlglot/pull/8293) by [@PhuocOng](https://github.com/PhuocOng))*:
307
+
308
+ normalize DATE_PART unit casing to match EXTRACT [CLAUDE] (#8293)
309
+
310
+ - due to [`bb6220b`](https://github.com/tobymao/sqlglot/commit/bb6220b76a852e87b95f0b6d00979732b29fcc1f) - stop dropping structured types on CREATE TABLE [GROK] *(PR [#8299](https://github.com/tobymao/sqlglot/pull/8299) by [@ishaan-upadhyay](https://github.com/ishaan-upadhyay))*:
311
+
312
+ stop dropping structured types on CREATE TABLE [GROK] (#8299)
313
+
314
+ - due to [`b3f23fe`](https://github.com/tobymao/sqlglot/commit/b3f23fe3cfc8107d349e058649728045c707fe5d) - mod generation precedence *(PR [#8290](https://github.com/tobymao/sqlglot/pull/8290) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
315
+
316
+ mod generation precedence (#8290)
317
+
318
+
319
+ ### :sparkles: New Features
320
+ - [`6e109b3`](https://github.com/tobymao/sqlglot/commit/6e109b3a796c41acba935442a23bf79bebef4a13) - **executor**: implement DPIPE [CLAUDE] *(PR [#8146](https://github.com/tobymao/sqlglot/pull/8146) by [@jbylund](https://github.com/jbylund))*
321
+ - [`8f60665`](https://github.com/tobymao/sqlglot/commit/8f606659077c0380cfbfe2ae53bd43583f41c4cf) - **optimizer**: annotate decode for postgres *(PR [#8157](https://github.com/tobymao/sqlglot/pull/8157) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*
322
+ - [`3bc3350`](https://github.com/tobymao/sqlglot/commit/3bc3350e23cf62e3136783b3d05fa0e17bff4c34) - **optimizer**: Provide support for databricks div(a,b) function *(PR [#8143](https://github.com/tobymao/sqlglot/pull/8143) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
323
+ - [`eb5d4da`](https://github.com/tobymao/sqlglot/commit/eb5d4daf499b498f4ee84af3444c53ab0f8726ea) - **executor**: add REVERSE to ENV [CLAUDE] *(PR [#8180](https://github.com/tobymao/sqlglot/pull/8180) by [@jbylund](https://github.com/jbylund))*
324
+ - [`f3b7c6c`](https://github.com/tobymao/sqlglot/commit/f3b7c6cb737c3d6c798f0c6b408ec8c9ffea6f4b) - **dremio**: support 4-argument REGEXP_SPLIT *(PR [#8148](https://github.com/tobymao/sqlglot/pull/8148) by [@rusackas](https://github.com/rusackas))*
325
+ - [`b4c9ad5`](https://github.com/tobymao/sqlglot/commit/b4c9ad5abcdc8cb76be72876b30881a46077a6c4) - **postgres**: parse BTRIM as TRIM *(PR [#8181](https://github.com/tobymao/sqlglot/pull/8181) by [@jbylund](https://github.com/jbylund))*
326
+ - [`4ff8ab3`](https://github.com/tobymao/sqlglot/commit/4ff8ab3614dca6d6cf6c8c73562886694675e443) - **executor**: evaluate subqueries the optimizer declines to rewrite [CLAUDE] *(PR [#8190](https://github.com/tobymao/sqlglot/pull/8190) by [@jbylund](https://github.com/jbylund))*
327
+ - [`20f2f70`](https://github.com/tobymao/sqlglot/commit/20f2f7035df0bda3b8a8e2c25e211a6fa0eb6b77) - **bigquery**: support digit-prefixed field names closes [#8175](https://github.com/tobymao/sqlglot/pull/8175) *(PR [#8196](https://github.com/tobymao/sqlglot/pull/8196) by [@georgesittas](https://github.com/georgesittas))*
328
+ - :arrow_lower_right: *addresses issue [#8175](https://github.com/tobymao/sqlglot/issues/8175) opened by [@sayantan-wisdom](https://github.com/sayantan-wisdom)*
329
+ - [`d7ada74`](https://github.com/tobymao/sqlglot/commit/d7ada74e21f33ebeaad0e382b2096460860c5984) - **optimizer**: annotate Left function for posrgres *(PR [#8189](https://github.com/tobymao/sqlglot/pull/8189) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*
330
+ - [`36785ce`](https://github.com/tobymao/sqlglot/commit/36785ce904ada62355b19e774b1ccd33f145d900) - **optimizer**: Annotate Reverse function for Postgres *(PR [#8201](https://github.com/tobymao/sqlglot/pull/8201) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*
331
+ - [`cddb7d0`](https://github.com/tobymao/sqlglot/commit/cddb7d03f1f4aa29d2f615dad2c086906e7e5ec1) - **optimizer**: annotate Overlay function for Postgres *(PR [#8200](https://github.com/tobymao/sqlglot/pull/8200) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*
332
+ - [`bb77a11`](https://github.com/tobymao/sqlglot/commit/bb77a117d96265d2732f458fc4e4be23e272d8c1) - **optimizer**: Annotate Right function for Postgres *(PR [#8203](https://github.com/tobymao/sqlglot/pull/8203) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*
333
+ - [`0575d38`](https://github.com/tobymao/sqlglot/commit/0575d387603ce7e41068489eec022ffe128ac7c6) - **optimizer**: Annotate Rpad function for Postgres *(PR [#8204](https://github.com/tobymao/sqlglot/pull/8204) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*
334
+ - [`e674a0e`](https://github.com/tobymao/sqlglot/commit/e674a0e8bae4f06b94eed72e2a781b2df978d983) - **optimizer**: Annotate SplitPart function for Postgres *(PR [#8205](https://github.com/tobymao/sqlglot/pull/8205) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*
335
+ - [`585908b`](https://github.com/tobymao/sqlglot/commit/585908b18440149275a0da16e2a7b483b6c34a9b) - **optimizer**: Annotate To_Hex function for Postgres *(PR [#8206](https://github.com/tobymao/sqlglot/pull/8206) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*
336
+ - [`542f7b4`](https://github.com/tobymao/sqlglot/commit/542f7b4ae884d6ff7e41a0ddb4f9590de008bc2f) - **optimizer**: Annotate Format function for Postgres *(PR [#8207](https://github.com/tobymao/sqlglot/pull/8207) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*
337
+ - [`a580417`](https://github.com/tobymao/sqlglot/commit/a5804178a558acc3a04eacb0057c280c52963ecd) - **optimizer**: Annotate Normalize function for Postgres *(PR [#8208](https://github.com/tobymao/sqlglot/pull/8208) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*
338
+ - [`2c77cb7`](https://github.com/tobymao/sqlglot/commit/2c77cb7482107082679a10aa0c67a264b1da1fad) - **optimizer**: Annotate ToNumber function for Postgres *(PR [#8210](https://github.com/tobymao/sqlglot/pull/8210) by [@vaishnavi-polekar](https://github.com/vaishnavi-polekar))*
339
+ - [`8579d7c`](https://github.com/tobymao/sqlglot/commit/8579d7ca57a9056e393161dd1524b76f2d92cc64) - **executor**: support OFFSET [CLAUDE] *(PR [#8219](https://github.com/tobymao/sqlglot/pull/8219) by [@jbylund](https://github.com/jbylund))*
340
+ - [`69b059e`](https://github.com/tobymao/sqlglot/commit/69b059e045150f0d12883eecbc2a0026e67a188e) - **clickhouse**: parse trimLeft/trimRight/trimBoth into Trim *(PR [#8240](https://github.com/tobymao/sqlglot/pull/8240) by [@raghav-reglobe](https://github.com/raghav-reglobe))*
341
+ - [`e105403`](https://github.com/tobymao/sqlglot/commit/e105403618effd3accb9bb43e93138d2b653b7a1) - **optimizer**: annotate maketime for postgres *(PR [#8253](https://github.com/tobymao/sqlglot/pull/8253) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*
342
+ - [`a3a2a21`](https://github.com/tobymao/sqlglot/commit/a3a2a2178d5f47fa548b5575da6b680bcd95d1c2) - **optimizer**: annotate regexpreplace for postgres *(PR [#8256](https://github.com/tobymao/sqlglot/pull/8256) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*
343
+ - [`79276b6`](https://github.com/tobymao/sqlglot/commit/79276b67d3ae01f97a443df0c20b00da51e87251) - **optimizer**: annotate make_timestamp for postgres *(PR [#8258](https://github.com/tobymao/sqlglot/pull/8258) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*
344
+ - [`f481c22`](https://github.com/tobymao/sqlglot/commit/f481c22bcbd8a453486d1b2a4543e93685b94ce6) - **optimizer**: annotate bit_or for postgres *(PR [#8264](https://github.com/tobymao/sqlglot/pull/8264) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*
345
+ - [`5294204`](https://github.com/tobymao/sqlglot/commit/52942044486ad91d16c93b714e686799591c59d4) - **optimizer**: annotate function bit_xor for postgres *(PR [#8274](https://github.com/tobymao/sqlglot/pull/8274) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*
346
+ - [`222eb11`](https://github.com/tobymao/sqlglot/commit/222eb11fc491b3593c52a1f6cf7c7adaeaaf4953) - **clickhouse**: support the view() table function [CLAUDE] *(PR [#8275](https://github.com/tobymao/sqlglot/pull/8275) by [@ei-grad](https://github.com/ei-grad))*
347
+ - [`45158c3`](https://github.com/tobymao/sqlglot/commit/45158c35c7d4ed3aea55564c2bfca352e2075e13) - explode(map) *(PR [#8235](https://github.com/tobymao/sqlglot/pull/8235) by [@betodealmeida](https://github.com/betodealmeida))*
348
+ - [`5a91be3`](https://github.com/tobymao/sqlglot/commit/5a91be3fbc014d54d78f2b38bcde89192245b9e4) - **postgres**: support LOCK as command *(PR [#8281](https://github.com/tobymao/sqlglot/pull/8281) by [@treysp](https://github.com/treysp))*
349
+ - :arrow_lower_right: *addresses issue [#8277](https://github.com/tobymao/sqlglot/issues/8277) opened by [@jerryhu1234](https://github.com/jerryhu1234)*
350
+ - [`b2a1bf5`](https://github.com/tobymao/sqlglot/commit/b2a1bf560ce5c0aafc84995f113f4499b5277e94) - **optimizer**: annotate localtimestamp for postgres *(PR [#8295](https://github.com/tobymao/sqlglot/pull/8295) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*
351
+ - [`2e86ded`](https://github.com/tobymao/sqlglot/commit/2e86ded7d0f6474e9041882058358616fb911464) - **teradata**: `mod()` func syntax *(commit by [@georgesittas](https://github.com/georgesittas))*
352
+
353
+ ### :bug: Bug Fixes
354
+ - [`29acdfd`](https://github.com/tobymao/sqlglot/commit/29acdfde9f2d2c1bfc2215c10279552ca4d63c7c) - **trino**: TIME literal with a timezone *(PR [#8154](https://github.com/tobymao/sqlglot/pull/8154) by [@fcfangcc](https://github.com/fcfangcc))*
355
+ - [`8ced6d5`](https://github.com/tobymao/sqlglot/commit/8ced6d5495455cd783fc5e81228d6d7ffd55781d) - **duckdb**: parenthesize JSON_VALUE arrow extract when parent requires it *(PR [#8153](https://github.com/tobymao/sqlglot/pull/8153) by [@Jacques-Peeters](https://github.com/Jacques-Peeters))*
356
+ - [`cefce19`](https://github.com/tobymao/sqlglot/commit/cefce19186791442c9995239e1e2bd4931db863a) - **postgres**: map JSONB_CONTAINS to @>, add JSONBContainsTopKey *(PR [#8156](https://github.com/tobymao/sqlglot/pull/8156) by [@georgesittas](https://github.com/georgesittas))*
357
+ - :arrow_lower_right: *fixes issue [#8152](https://github.com/tobymao/sqlglot/issues/8152) opened by [@RogerHYang](https://github.com/RogerHYang)*
358
+ - [`ecf5b97`](https://github.com/tobymao/sqlglot/commit/ecf5b97819c91257a21dcb1acd7780e8e4563932) - **executor**: return NULL from POW instead of raising [CLAUDE] *(PR [#8159](https://github.com/tobymao/sqlglot/pull/8159) by [@jbylund](https://github.com/jbylund))*
359
+ - [`d89f392`](https://github.com/tobymao/sqlglot/commit/d89f392e089d13b8e217ca4501558d6da263eb4d) - **mysql**: map %x and %r date format specifiers [CLAUDE] *(PR [#8142](https://github.com/tobymao/sqlglot/pull/8142) by [@codeAnqiang-ma](https://github.com/codeAnqiang-ma))*
360
+ - [`05f5484`](https://github.com/tobymao/sqlglot/commit/05f548429469133b502b303dd367f96f4e3126ba) - **executor**: honor nulls_first when ordering [CLAUDE] *(PR [#8158](https://github.com/tobymao/sqlglot/pull/8158) by [@jbylund](https://github.com/jbylund))*
361
+ - [`83129c7`](https://github.com/tobymao/sqlglot/commit/83129c711baf600f6ae902f79cf1cd6e50bdba58) - **snowflake**: robust filter_sql anonymous func handling, closes [#8170](https://github.com/tobymao/sqlglot/pull/8170) *(commit by [@georgesittas](https://github.com/georgesittas))*
362
+ - [`d138cae`](https://github.com/tobymao/sqlglot/commit/d138cae03d21656d66e512ab489a0cf9441d4b0a) - don't crash in exp.cast() when the input is already a cast to INTERVAL (CLAUDE) *(PR [#8173](https://github.com/tobymao/sqlglot/pull/8173) by [@eeshsaxena](https://github.com/eeshsaxena))*
363
+ - :arrow_lower_right: *fixes issue [#8172](https://github.com/tobymao/sqlglot/issues/8172) opened by [@eeshsaxena](https://github.com/eeshsaxena)*
364
+ - [`bf34105`](https://github.com/tobymao/sqlglot/commit/bf3410543fd15e983138311577b58455e41f9551) - **sqlite**: render RegexpLike as the REGEXP operator [CLAUDE] *(PR [#8163](https://github.com/tobymao/sqlglot/pull/8163) by [@nikolauspschuetz](https://github.com/nikolauspschuetz))*
365
+ - :arrow_lower_right: *fixes issue [#8080](https://github.com/tobymao/sqlglot/issues/8080) opened by [@RogerHYang](https://github.com/RogerHYang)*
366
+ - [`21092b3`](https://github.com/tobymao/sqlglot/commit/21092b3086f0bfba400de98c6deade6f4f6d3de3) - **optimizer**: do not normalize identifiers that name data rather than references *(PR [#8161](https://github.com/tobymao/sqlglot/pull/8161) by [@georgesittas](https://github.com/georgesittas))*
367
+ - [`ebd15d9`](https://github.com/tobymao/sqlglot/commit/ebd15d99958662562359b7469bb958f4b4790767) - **executor**: return NULL from typed division of NULL [CLAUDE] *(PR [#8178](https://github.com/tobymao/sqlglot/pull/8178) by [@jbylund](https://github.com/jbylund))*
368
+ - [`39e289a`](https://github.com/tobymao/sqlglot/commit/39e289a75efb250d45c2dfcfffc719f19e9925a2) - **executor**: parenthesize CASE in generated Python [CLAUDE] *(PR [#8176](https://github.com/tobymao/sqlglot/pull/8176) by [@jbylund](https://github.com/jbylund))*
369
+ - [`f64adb4`](https://github.com/tobymao/sqlglot/commit/f64adb4c9a3f96ff4ad692d571b80848ad1b649d) - **bigquery**: array_agg(<subquery> ignore nulls) AttributeError closes [#8193](https://github.com/tobymao/sqlglot/pull/8193) *(commit by [@georgesittas](https://github.com/georgesittas))*
370
+ - [`a570cf8`](https://github.com/tobymao/sqlglot/commit/a570cf8a908d02e78b66cec1478ab066f1ff1f0d) - **bigquery**: parse FULL/LEFT before set ops as modifiers, not aliases closes [#8195](https://github.com/tobymao/sqlglot/pull/8195) *(commit by [@georgesittas](https://github.com/georgesittas))*
371
+ - [`6e30ee7`](https://github.com/tobymao/sqlglot/commit/6e30ee791c1a993d7722d641d12967afc8fd9548) - **parser**: inline digit-prefixed field parsing to avoid deepening recursion *(commit by [@georgesittas](https://github.com/georgesittas))*
372
+ - [`6874e1c`](https://github.com/tobymao/sqlglot/commit/6874e1c4bfa398d8dc2b4310fcadd304a0715d16) - **clickhouse**: make VALUES tuple wrapping idempotent [CLAUDE] *(PR [#8185](https://github.com/tobymao/sqlglot/pull/8185) by [@sanket801036](https://github.com/sanket801036))*
373
+ - [`7cca122`](https://github.com/tobymao/sqlglot/commit/7cca122d28c4cedbd7a9baed4bee39f241710b8c) - **clickhouse**: preserve quoted parameterized relations *(PR [#8198](https://github.com/tobymao/sqlglot/pull/8198) by [@alessio-gastaldo](https://github.com/alessio-gastaldo))*
374
+ - [`1ba7b27`](https://github.com/tobymao/sqlglot/commit/1ba7b2715dd9aba896edc7dc69fcc41bbb601b90) - **executor**: return the rows of an ORDER BY over a set operation [CLAUDE] *(PR [#8214](https://github.com/tobymao/sqlglot/pull/8214) by [@jbylund](https://github.com/jbylund))*
375
+ - [`f62c344`](https://github.com/tobymao/sqlglot/commit/f62c3446d0590daea30fed77264194b53b725d24) - **qualify**: resolve snowflake positional column refs *(PR [#8202](https://github.com/tobymao/sqlglot/pull/8202) by [@treysp](https://github.com/treysp))*
376
+ - [`038f015`](https://github.com/tobymao/sqlglot/commit/038f015992d31163bd16075b8508a0c1df0f28e2) - **parser**: parse a list of tables in DROP TABLE [CLAUDE] *(PR [#8223](https://github.com/tobymao/sqlglot/pull/8223) by [@sanket801036](https://github.com/sanket801036))*
377
+ - :arrow_lower_right: *fixes issue [#8222](https://github.com/tobymao/sqlglot/issues/8222) opened by [@guijinxin](https://github.com/guijinxin)*
378
+ - [`8efda2c`](https://github.com/tobymao/sqlglot/commit/8efda2c6cee394d195ef8ec1856c196228383dc2) - **parser**: ANALYZE and DROP with multiple tables *(PR [#8229](https://github.com/tobymao/sqlglot/pull/8229) by [@geooo109](https://github.com/geooo109))*
379
+ - :arrow_lower_right: *fixes issue [#8227](https://github.com/tobymao/sqlglot/issues/8227) opened by [@guijinxin](https://github.com/guijinxin)*
380
+ - [`05eed63`](https://github.com/tobymao/sqlglot/commit/05eed63b281f7ac020045e2b792beef8fad8d3ee) - **executor**: execute an IN/ANY subquery that has no FROM [CLAUDE] *(PR [#8221](https://github.com/tobymao/sqlglot/pull/8221) by [@jbylund](https://github.com/jbylund))*
381
+ - [`91119bc`](https://github.com/tobymao/sqlglot/commit/91119bcaac977ede6f4a641bdda593b0015ef998) - **mysql**: support KEY in CREATE TABLE column definition *(PR [#8230](https://github.com/tobymao/sqlglot/pull/8230) by [@treysp](https://github.com/treysp))*
382
+ - :arrow_lower_right: *fixes issue [#8225](https://github.com/tobymao/sqlglot/issues/8225) opened by [@guijinxin](https://github.com/guijinxin)*
383
+ - [`1e9c804`](https://github.com/tobymao/sqlglot/commit/1e9c804ec54ff74b81d965fe487dcbd5af72b0a5) - **optimizer**: decline decorrelation of a negated correlated IN [CLAUDE] *(PR [#8236](https://github.com/tobymao/sqlglot/pull/8236) by [@jbylund](https://github.com/jbylund))*
384
+ - [`b79cbf8`](https://github.com/tobymao/sqlglot/commit/b79cbf86d154f3ccfca1dada7073435fdaa06b09) - **optimizer**: preserve UNPIVOT passthrough columns *(PR [#8238](https://github.com/tobymao/sqlglot/pull/8238) by [@treysp](https://github.com/treysp))*
385
+ - [`ce427c9`](https://github.com/tobymao/sqlglot/commit/ce427c96246a8a0bc4f05a47a39adbba0bc7a7b1) - **postgres**: don't emit JSON_EXTRACT_PATH with no keys for a root-only JSON path [CLAUDE] *(PR [#8233](https://github.com/tobymao/sqlglot/pull/8233) by [@jaideeppyne](https://github.com/jaideeppyne))*
386
+ - :arrow_lower_right: *fixes issue [#8232](https://github.com/tobymao/sqlglot/issues/8232) opened by [@RogerHYang](https://github.com/RogerHYang)*
387
+ - [`2a46a03`](https://github.com/tobymao/sqlglot/commit/2a46a03311aa014e645f26bf4d8ad87ee590bf3a) - **clickhouse**: generate native lag/lead instead of lagInFrame/leadInFrame *(commit by [@tobymao](https://github.com/tobymao))*
388
+ - [`40f285c`](https://github.com/tobymao/sqlglot/commit/40f285cb61edff4a40950fc708e79ae4e8ed583d) - **clickhouse**: preserve multi-array arrayMap and arrayFilter *(commit by [@tobymao](https://github.com/tobymao))*
389
+ - [`d5e3f14`](https://github.com/tobymao/sqlglot/commit/d5e3f14b109ebe5decd66bc77bde38fd5b001bb1) - **parser, optimizer**: support starrocks GENERATE_SERIES parse and qualify *(PR [#8246](https://github.com/tobymao/sqlglot/pull/8246) by [@geooo109](https://github.com/geooo109))*
390
+ - :arrow_lower_right: *fixes issue [#8244](https://github.com/tobymao/sqlglot/issues/8244) opened by [@xiayaoshun](https://github.com/xiayaoshun)*
391
+ - [`a60171e`](https://github.com/tobymao/sqlglot/commit/a60171e8f73257a3917f2a95b308183460fb159d) - **optimizer**: apply qualified star exclusions only to the referenced source *(PR [#8247](https://github.com/tobymao/sqlglot/pull/8247) by [@geooo109](https://github.com/geooo109))*
392
+ - :arrow_lower_right: *fixes issue [#8245](https://github.com/tobymao/sqlglot/issues/8245) opened by [@paddy-devan](https://github.com/paddy-devan)*
393
+ - [`88419b1`](https://github.com/tobymao/sqlglot/commit/88419b1aa19453be7fca80c0178362b1fbf2d6e1) - **dialect**: fall back on TokenError when an operand isn't a JSON path *(PR [#8260](https://github.com/tobymao/sqlglot/pull/8260) by [@jaideeppyne](https://github.com/jaideeppyne))*
394
+ - :arrow_lower_right: *fixes issue [#8249](https://github.com/tobymao/sqlglot/issues/8249) opened by [@RogerHYang](https://github.com/RogerHYang)*
395
+ - [`f131ec9`](https://github.com/tobymao/sqlglot/commit/f131ec9f9ea40ce55f0e254baa41b01f87bad25c) - **snowflake**: parse a qualified wildcard in OBJECT_CONSTRUCT_KEEP_NULL *(PR [#8270](https://github.com/tobymao/sqlglot/pull/8270) by [@ishaan-upadhyay](https://github.com/ishaan-upadhyay))*
396
+ - :arrow_lower_right: *fixes issue [#8262](https://github.com/tobymao/sqlglot/issues/8262) opened by [@ishaan-upadhyay](https://github.com/ishaan-upadhyay)*
397
+ - [`4303c3f`](https://github.com/tobymao/sqlglot/commit/4303c3f30f8fa23f40853858260d8ec83ccfd882) - **parser**: don't raise ValueError on a GRANT or REVOKE with no privileges [CLAUDE] *(PR [#8271](https://github.com/tobymao/sqlglot/pull/8271) by [@tsamaras](https://github.com/tsamaras))*
398
+ - [`3762ef4`](https://github.com/tobymao/sqlglot/commit/3762ef4361895ad764a8c3e117132d6a0d1c47df) - **parser**: Parse MOD at multiplicative precedence *(PR [#8259](https://github.com/tobymao/sqlglot/pull/8259) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
399
+ - [`3110e15`](https://github.com/tobymao/sqlglot/commit/3110e151bfe6e229ec6b85708a56a9340a56c6a6) - **sqlite**: preserve explicit end bound in RANGE CURRENT ROW window frames [CLAUDE] *(PR [#8267](https://github.com/tobymao/sqlglot/pull/8267) by [@AmirF194](https://github.com/AmirF194))*
400
+ - :arrow_lower_right: *fixes issue [#8209](https://github.com/tobymao/sqlglot/issues/8209) opened by [@glaziermag](https://github.com/glaziermag)*
401
+ - [`d0aa2b4`](https://github.com/tobymao/sqlglot/commit/d0aa2b432498ec00f88a8721a904afe2e1b5c24d) - **optimizer**: raise OptimizeError instead of corrupting the scope graph in _traverse_union [CLAUDE] *(PR [#8269](https://github.com/tobymao/sqlglot/pull/8269) by [@chaitanyaatlan](https://github.com/chaitanyaatlan))*
402
+ - :arrow_lower_right: *fixes issue [#8268](https://github.com/tobymao/sqlglot/issues/8268) opened by [@chaitanyaatlan](https://github.com/chaitanyaatlan)*
403
+ - [`9fac05c`](https://github.com/tobymao/sqlglot/commit/9fac05c062f0c9258cee2c72108a14f498f47737) - **sqlite**: keep the `COALESCE` wrapping when `CONCAT` is generated as `||` *(PR [#8283](https://github.com/tobymao/sqlglot/pull/8283) by [@ebarkhordar](https://github.com/ebarkhordar))*
404
+ - [`2be2afc`](https://github.com/tobymao/sqlglot/commit/2be2afc69fcaeee5bc83ecab555fbdc0a0891b81) - **optimizer**: don't push WHERE predicates into sources a later RIGHT or FULL join null-extends [CLAUDE] *(PR [#8282](https://github.com/tobymao/sqlglot/pull/8282) by [@jaideeppyne](https://github.com/jaideeppyne))*
405
+ - [`9b25ca5`](https://github.com/tobymao/sqlglot/commit/9b25ca5dbef52c348cb9a45706bac4f41fb56f4d) - **mysql**: parse BINARY column attribute as a column constraint [CLAUDE] *(PR [#8286](https://github.com/tobymao/sqlglot/pull/8286) by [@PhuocOng](https://github.com/PhuocOng))*
406
+ - [`67cf1ec`](https://github.com/tobymao/sqlglot/commit/67cf1ec91dfe2658f41c049130ab242a40bf4789) - **parser**: stop GROUP BY from consuming query modifiers [CLAUDE] *(PR [#8285](https://github.com/tobymao/sqlglot/pull/8285) by [@Kunal8954](https://github.com/Kunal8954))*
407
+ - :arrow_lower_right: *fixes issue [#8279](https://github.com/tobymao/sqlglot/issues/8279) opened by [@RogerHYang](https://github.com/RogerHYang)*
408
+ - [`6b9cb87`](https://github.com/tobymao/sqlglot/commit/6b9cb87bd01ed4606d1902a0266ff79aad78b54f) - **postgres**: preserve quoting of the one-byte "char" type [CLAUDE] *(PR [#8284](https://github.com/tobymao/sqlglot/pull/8284) by [@Kunal8954](https://github.com/Kunal8954))*
409
+ - :arrow_lower_right: *fixes issue [#8280](https://github.com/tobymao/sqlglot/issues/8280) opened by [@RogerHYang](https://github.com/RogerHYang)*
410
+ - [`e2f4ad7`](https://github.com/tobymao/sqlglot/commit/e2f4ad7d50cb764c78da69b5ca7933c69156ebaa) - **redshift**: preserve quoting of the one-byte "char" type *(commit by [@georgesittas](https://github.com/georgesittas))*
411
+ - [`f064484`](https://github.com/tobymao/sqlglot/commit/f064484b68547d9c80a9bcecd5e07dd8a056a36b) - **postgres**: normalize DATE_PART unit casing to match EXTRACT [CLAUDE] *(PR [#8293](https://github.com/tobymao/sqlglot/pull/8293) by [@PhuocOng](https://github.com/PhuocOng))*
412
+ - :arrow_lower_right: *fixes issue [#8292](https://github.com/tobymao/sqlglot/issues/8292) opened by [@PhuocOng](https://github.com/PhuocOng)*
413
+ - [`d546830`](https://github.com/tobymao/sqlglot/commit/d5468304f6a1b8e9ec20aa3ea8564031be2f6e0e) - **spark**: distinguish GROUPING SETS suffix syntax *(PR [#8288](https://github.com/tobymao/sqlglot/pull/8288) by [@treysp](https://github.com/treysp))*
414
+ - :arrow_lower_right: *fixes issue [#8266](https://github.com/tobymao/sqlglot/issues/8266) opened by [@wwzhe007](https://github.com/wwzhe007)*
415
+ - [`c6c1fa4`](https://github.com/tobymao/sqlglot/commit/c6c1fa4d3775eadd8673ddb9a8d4211dfe1cdd4f) - **transforms**: keep the table when dropping an unnamed UNIQUE constraint [CLAUDE] *(PR [#8300](https://github.com/tobymao/sqlglot/pull/8300) by [@PhuocOng](https://github.com/PhuocOng))*
416
+ - :arrow_lower_right: *fixes issue [#8297](https://github.com/tobymao/sqlglot/issues/8297) opened by [@krishnakaanchan-png](https://github.com/krishnakaanchan-png)*
417
+ - [`bb6220b`](https://github.com/tobymao/sqlglot/commit/bb6220b76a852e87b95f0b6d00979732b29fcc1f) - **snowflake**: stop dropping structured types on CREATE TABLE [GROK] *(PR [#8299](https://github.com/tobymao/sqlglot/pull/8299) by [@ishaan-upadhyay](https://github.com/ishaan-upadhyay))*
418
+ - :arrow_lower_right: *fixes issue [#8298](https://github.com/tobymao/sqlglot/issues/8298) opened by [@ishaan-upadhyay](https://github.com/ishaan-upadhyay)*
419
+ - [`b3f23fe`](https://github.com/tobymao/sqlglot/commit/b3f23fe3cfc8107d349e058649728045c707fe5d) - **generator**: mod generation precedence *(PR [#8290](https://github.com/tobymao/sqlglot/pull/8290) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
420
+ - [`2391144`](https://github.com/tobymao/sqlglot/commit/23911445cb38e14978ab9a4e0b29d0a58b80fa88) - **postgres**: keep the time zone argument of DATE_TRUNC [CLAUDE] *(PR [#8305](https://github.com/tobymao/sqlglot/pull/8305) by [@dylanpulver](https://github.com/dylanpulver))*
421
+
422
+ ### :zap: Performance Improvements
423
+ - [`1fa9653`](https://github.com/tobymao/sqlglot/commit/1fa965376ccf6e972c6aa4a3c6a587f4bce9b494) - **dialects**: cache dialect classes resolved through the package __getattr__ *(PR [#8303](https://github.com/tobymao/sqlglot/pull/8303) by [@tobymao](https://github.com/tobymao))*
424
+
425
+ ### :recycle: Refactors
426
+ - [`829c2b1`](https://github.com/tobymao/sqlglot/commit/829c2b1c7061cbdc6c65ae7ea13dea73aa12522a) - clean up nth_value from [first|last] support *(commit by [@georgesittas](https://github.com/georgesittas))*
427
+ - [`b11c3d9`](https://github.com/tobymao/sqlglot/commit/b11c3d915ca617ea6f343b0c7cc4b392766fdaa0) - **optimizer**: clean up `pushdown_projections` *(commit by [@georgesittas](https://github.com/georgesittas))*
428
+
429
+ ### :white_check_mark: Tests
430
+ - [`ceb5111`](https://github.com/tobymao/sqlglot/commit/ceb5111421e9aa6135f7c650c1995ee19f9528a2) - **clickhouse**: pin the trim renderings for non-ClickHouse targets *(commit by [@tobymao](https://github.com/tobymao))*
431
+ - [`99947fb`](https://github.com/tobymao/sqlglot/commit/99947fbcc5fa34f4db6354c97f6cef79c105d41b) - **executor**: pin the clock in test_scalar_functions to fix a rollover flake [CLAUDE] *(PR [#8276](https://github.com/tobymao/sqlglot/pull/8276) by [@nikolauspschuetz](https://github.com/nikolauspschuetz))*
432
+
433
+ ### :wrench: Chores
434
+ - [`a04d327`](https://github.com/tobymao/sqlglot/commit/a04d327b10902537a414f0fa64f91afa1e622e32) - **parser**: clean up multi-table DROP TABLE *(commit by [@geooo109](https://github.com/geooo109))*
435
+ - [`d002d4d`](https://github.com/tobymao/sqlglot/commit/d002d4dac34967ff10df31557b278a427e63428d) - **clickhouse**: tidy up the trim builders and tests *(commit by [@tobymao](https://github.com/tobymao))*
436
+ - [`37362f4`](https://github.com/tobymao/sqlglot/commit/37362f4fc1d63c4687149cec3a8aab109c1eb989) - simplify TRIMBOTH parsing for ck *(commit by [@geooo109](https://github.com/geooo109))*
437
+
438
+
4
439
  ## [v30.17.0] - 2026-08-12
5
440
  ### :boom: BREAKING CHANGES
6
441
  - due to [`5c12472`](https://github.com/tobymao/sqlglot/commit/5c12472a8016dff6eb8d9aab9c9a029adab2d514) - stop optimizing OR-conditioned joins and anti joins *(PR [#8118](https://github.com/tobymao/sqlglot/pull/8118) by [@georgesittas](https://github.com/georgesittas))*:
@@ -15484,3 +15919,5 @@ pip install "sqlglot[c]" # compiled — faster, but no subclassing
15484
15919
  [v30.14.0]: https://github.com/tobymao/sqlglot/compare/v30.13.0...v30.14.0
15485
15920
  [v30.16.0]: https://github.com/tobymao/sqlglot/compare/v30.15.0...v30.16.0
15486
15921
  [v30.17.0]: https://github.com/tobymao/sqlglot/compare/v30.16.0...v30.17.0
15922
+ [v30.18.0]: https://github.com/tobymao/sqlglot/compare/v30.17.0...v30.18.0
15923
+ [v30.19.0]: https://github.com/tobymao/sqlglot/compare/v30.18.0...v30.19.0
@@ -7,7 +7,7 @@ else
7
7
  endif
8
8
 
9
9
  SO_BACKUP := /tmp/sqlglot_so_backup
10
- FIND_SO := find sqlglot -name "*.so"
10
+ FIND_SO := find sqlglot \( -name "*.so" -o -name "*.pyd" \)
11
11
  NPROC := $(shell python -c "import os; print(os.cpu_count() or 1)")
12
12
 
13
13
  hidec:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 30.18.0
3
+ Version: 30.20.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.18.0; python_version >= "3.10" and extra == "c"
37
+ Requires-Dist: sqlglotc==30.20.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.18.0; python_version >= "3.10" and extra == "rs"
40
+ Requires-Dist: sqlglotc==30.20.0; python_version >= "3.10" and extra == "rs"
41
41
  Dynamic: license-file
42
42
  Dynamic: provides-extra
43
43
 
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '30.18.0'
22
- __version_tuple__ = version_tuple = (30, 18, 0)
21
+ __version__ = version = '30.20.0'
22
+ __version_tuple__ = version_tuple = (30, 20, 0)
23
23
 
24
- __commit_id__ = commit_id = 'g2e86ded7d'
24
+ __commit_id__ = commit_id = 'g8bd768664'
@@ -2285,15 +2285,12 @@ def json_extract_segments(
2285
2285
 
2286
2286
  segments = []
2287
2287
  for segment in path.expressions:
2288
- escape = segment.args.get("quoted")
2289
2288
  path = self.sql(segment)
2290
2289
  if path:
2291
2290
  if isinstance(segment, exp.JSONPathPart) and (
2292
2291
  quoted_index or not isinstance(segment, exp.JSONPathSubscript)
2293
2292
  ):
2294
- if escape:
2295
- path = self.escape_str(path)
2296
-
2293
+ path = self.escape_str(path)
2297
2294
  path = f"{self.dialect.QUOTE_START}{path}{self.dialect.QUOTE_END}"
2298
2295
 
2299
2296
  segments.append(path)
@@ -26,6 +26,7 @@ class MySQL(Dialect):
26
26
 
27
27
  TIME_FORMAT = "'%Y-%m-%d %T'"
28
28
  DPIPE_IS_STRING_CONCAT = False
29
+ CONCAT_WS_COALESCE = True
29
30
  SUPPORTS_USER_DEFINED_TYPES = False
30
31
  SAFE_DIVISION = True
31
32
  SAFE_TO_ELIMINATE_DOUBLE_NEGATION = False