sqlglot 30.18.0__tar.gz → 30.19.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. {sqlglot-30.18.0 → sqlglot-30.19.0}/.gitignore +1 -0
  2. {sqlglot-30.18.0 → sqlglot-30.19.0}/CHANGELOG.md +232 -0
  3. {sqlglot-30.18.0 → sqlglot-30.19.0}/Makefile +1 -1
  4. {sqlglot-30.18.0/sqlglot.egg-info → sqlglot-30.19.0}/PKG-INFO +3 -3
  5. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/_version.py +3 -3
  6. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/dialect.py +1 -4
  7. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/mysql.py +1 -0
  8. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/sqlite.py +2 -0
  9. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/executor/env.py +6 -0
  10. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/expressions/__init__.py +3 -0
  11. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/expressions/aggregate.py +6 -0
  12. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/expressions/array.py +6 -1
  13. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/expressions/core.py +4 -0
  14. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/expressions/json.py +4 -0
  15. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/expressions/query.py +20 -5
  16. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/expressions/string.py +1 -0
  17. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generator.py +23 -14
  18. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/clickhouse.py +10 -0
  19. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/databricks.py +1 -1
  20. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/doris.py +15 -0
  21. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/duckdb.py +12 -12
  22. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/fabric.py +5 -5
  23. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/mysql.py +12 -2
  24. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/python.py +10 -1
  25. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/singlestore.py +11 -0
  26. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/spark.py +3 -0
  27. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/sqlite.py +52 -25
  28. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/teradata.py +1 -0
  29. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/trino.py +41 -0
  30. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/tsql.py +61 -3
  31. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/lineage.py +1 -1
  32. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/annotate_types.py +5 -4
  33. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/canonicalize_internal_names.py +4 -4
  34. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/eliminate_subqueries.py +3 -1
  35. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/journal.py +4 -4
  36. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/merge_subqueries.py +2 -2
  37. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/pushdown_predicates.py +9 -1
  38. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/pushdown_projections.py +141 -47
  39. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/qualify_columns.py +57 -13
  40. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/resolver.py +23 -7
  41. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/scope.py +27 -21
  42. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/simplify.py +73 -43
  43. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/unnest_subqueries.py +138 -38
  44. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parser.py +49 -36
  45. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/bigquery.py +0 -6
  46. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/hive.py +6 -0
  47. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/mysql.py +53 -7
  48. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/redshift.py +2 -0
  49. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/snowflake.py +7 -2
  50. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/sqlite.py +5 -0
  51. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/trino.py +0 -6
  52. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/tsql.py +2 -2
  53. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/planner.py +58 -18
  54. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/transforms.py +8 -4
  55. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/typing/duckdb.py +22 -0
  56. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/typing/postgres.py +1 -0
  57. {sqlglot-30.18.0 → sqlglot-30.19.0/sqlglot.egg-info}/PKG-INFO +3 -3
  58. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot.egg-info/requires.txt +2 -2
  59. sqlglot-30.19.0/sqlglot.egg-info/scm_version.json +8 -0
  60. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_clickhouse.py +35 -0
  61. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_databricks.py +6 -0
  62. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_dialect.py +34 -1
  63. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_doris.py +29 -0
  64. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_duckdb.py +16 -0
  65. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_fabric.py +15 -5
  66. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_mysql.py +103 -5
  67. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_presto.py +0 -7
  68. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_redshift.py +3 -0
  69. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_singlestore.py +28 -1
  70. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_snowflake.py +70 -5
  71. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_spark.py +21 -6
  72. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_sqlite.py +135 -10
  73. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_trino.py +104 -1
  74. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_tsql.py +235 -3
  75. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/annotate_functions.sql +3 -0
  76. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/optimizer.sql +2 -1
  77. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/pushdown_predicates.sql +8 -2
  78. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/pushdown_projections.sql +12 -0
  79. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/simplify.sql +190 -24
  80. sqlglot-30.19.0/tests/fixtures/optimizer/unnest_subqueries.sql +297 -0
  81. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/helpers.py +4 -0
  82. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/leakcheck.py +5 -3
  83. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_executor.py +223 -0
  84. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_expressions.py +12 -0
  85. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_generator.py +2 -1
  86. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_jsonpath.py +2 -1
  87. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_optimizer.py +64 -1
  88. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_parser.py +12 -0
  89. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_serde.py +2 -2
  90. sqlglot-30.18.0/sqlglot.egg-info/scm_version.json +0 -8
  91. sqlglot-30.18.0/tests/fixtures/optimizer/unnest_subqueries.sql +0 -146
  92. {sqlglot-30.18.0 → sqlglot-30.19.0}/.gitmodules +0 -0
  93. {sqlglot-30.18.0 → sqlglot-30.19.0}/.gitpod.yml +0 -0
  94. {sqlglot-30.18.0 → sqlglot-30.19.0}/.pre-commit-config.yaml +0 -0
  95. {sqlglot-30.18.0 → sqlglot-30.19.0}/AGENTS.md +0 -0
  96. {sqlglot-30.18.0 → sqlglot-30.19.0}/CLAUDE.md +0 -0
  97. {sqlglot-30.18.0 → sqlglot-30.19.0}/CONTRIBUTING.md +0 -0
  98. {sqlglot-30.18.0 → sqlglot-30.19.0}/LICENSE +0 -0
  99. {sqlglot-30.18.0 → sqlglot-30.19.0}/MANIFEST.in +0 -0
  100. {sqlglot-30.18.0 → sqlglot-30.19.0}/README.md +0 -0
  101. {sqlglot-30.18.0 → sqlglot-30.19.0}/pyproject.toml +0 -0
  102. {sqlglot-30.18.0 → sqlglot-30.19.0}/setup.cfg +0 -0
  103. {sqlglot-30.18.0 → sqlglot-30.19.0}/setup.py +0 -0
  104. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/__init__.py +0 -0
  105. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/__main__.py +0 -0
  106. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/_typing.py +0 -0
  107. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/anonymize.py +0 -0
  108. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/__init__.py +0 -0
  109. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/athena.py +0 -0
  110. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/bigquery.py +0 -0
  111. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/clickhouse.py +0 -0
  112. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/databricks.py +0 -0
  113. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/dax.py +0 -0
  114. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/doris.py +0 -0
  115. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/dremio.py +0 -0
  116. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/drill.py +0 -0
  117. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/druid.py +0 -0
  118. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/duckdb.py +0 -0
  119. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/dune.py +0 -0
  120. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/exasol.py +0 -0
  121. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/fabric.py +0 -0
  122. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/hive.py +0 -0
  123. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/materialize.py +0 -0
  124. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/oracle.py +0 -0
  125. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/postgres.py +0 -0
  126. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/presto.py +0 -0
  127. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/prql.py +0 -0
  128. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/redshift.py +0 -0
  129. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/risingwave.py +0 -0
  130. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/singlestore.py +0 -0
  131. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/snowflake.py +0 -0
  132. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/solr.py +0 -0
  133. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/spark.py +0 -0
  134. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/spark2.py +0 -0
  135. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/starrocks.py +0 -0
  136. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/tableau.py +0 -0
  137. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/teradata.py +0 -0
  138. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/trino.py +0 -0
  139. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/dialects/tsql.py +0 -0
  140. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/diff.py +0 -0
  141. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/errors.py +0 -0
  142. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/executor/__init__.py +0 -0
  143. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/executor/context.py +0 -0
  144. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/executor/python.py +0 -0
  145. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/executor/table.py +0 -0
  146. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/expressions/builders.py +0 -0
  147. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/expressions/constraints.py +0 -0
  148. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/expressions/datatypes.py +0 -0
  149. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/expressions/ddl.py +0 -0
  150. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/expressions/dml.py +0 -0
  151. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/expressions/functions.py +0 -0
  152. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/expressions/math.py +0 -0
  153. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/expressions/properties.py +0 -0
  154. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/expressions/temporal.py +0 -0
  155. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/__init__.py +0 -0
  156. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/athena.py +0 -0
  157. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/bigquery.py +0 -0
  158. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/dax.py +0 -0
  159. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/dremio.py +0 -0
  160. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/drill.py +0 -0
  161. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/druid.py +0 -0
  162. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/dune.py +0 -0
  163. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/exasol.py +0 -0
  164. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/hive.py +0 -0
  165. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/materialize.py +0 -0
  166. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/oracle.py +0 -0
  167. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/postgres.py +0 -0
  168. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/presto.py +0 -0
  169. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/prql.py +0 -0
  170. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/redshift.py +0 -0
  171. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/risingwave.py +0 -0
  172. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/snowflake.py +0 -0
  173. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/solr.py +0 -0
  174. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/spark2.py +0 -0
  175. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/starrocks.py +0 -0
  176. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/generators/tableau.py +0 -0
  177. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/helper.py +0 -0
  178. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/jsonpath.py +0 -0
  179. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/__init__.py +0 -0
  180. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/canonicalize.py +0 -0
  181. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
  182. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
  183. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  184. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/normalize.py +0 -0
  185. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  186. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/optimize_joins.py +0 -0
  187. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/optimizer.py +0 -0
  188. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/qualify.py +0 -0
  189. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/optimizer/qualify_tables.py +0 -0
  190. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/__init__.py +0 -0
  191. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/athena.py +0 -0
  192. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/base.py +0 -0
  193. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/clickhouse.py +0 -0
  194. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/databricks.py +0 -0
  195. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/dax.py +0 -0
  196. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/doris.py +0 -0
  197. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/dremio.py +0 -0
  198. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/drill.py +0 -0
  199. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/druid.py +0 -0
  200. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/duckdb.py +0 -0
  201. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/dune.py +0 -0
  202. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/exasol.py +0 -0
  203. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/fabric.py +0 -0
  204. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/materialize.py +0 -0
  205. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/oracle.py +0 -0
  206. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/postgres.py +0 -0
  207. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/presto.py +0 -0
  208. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/prql.py +0 -0
  209. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/risingwave.py +0 -0
  210. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/singlestore.py +0 -0
  211. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/solr.py +0 -0
  212. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/spark.py +0 -0
  213. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/spark2.py +0 -0
  214. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/starrocks.py +0 -0
  215. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/tableau.py +0 -0
  216. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/parsers/teradata.py +0 -0
  217. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/py.typed +0 -0
  218. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/schema.py +0 -0
  219. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/serde.py +0 -0
  220. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/time.py +0 -0
  221. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/tokenizer_core.py +0 -0
  222. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/tokens.py +0 -0
  223. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/trie.py +0 -0
  224. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/typing/__init__.py +0 -0
  225. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/typing/bigquery.py +0 -0
  226. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/typing/clickhouse.py +0 -0
  227. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/typing/databricks.py +0 -0
  228. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/typing/hive.py +0 -0
  229. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/typing/mysql.py +0 -0
  230. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/typing/presto.py +0 -0
  231. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/typing/redshift.py +0 -0
  232. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/typing/snowflake.py +0 -0
  233. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/typing/spark.py +0 -0
  234. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/typing/spark2.py +0 -0
  235. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot/typing/tsql.py +0 -0
  236. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot.egg-info/SOURCES.txt +0 -0
  237. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot.egg-info/dependency_links.txt +0 -0
  238. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot.egg-info/scm_file_list.json +0 -0
  239. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot.egg-info/top_level.txt +0 -0
  240. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglot.png +0 -0
  241. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglotc/MANIFEST.in +0 -0
  242. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglotc/pyproject.toml +0 -0
  243. {sqlglot-30.18.0 → sqlglot-30.19.0}/sqlglotc/setup.py +0 -0
  244. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/__init__.py +0 -0
  245. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/__init__.py +0 -0
  246. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_athena.py +0 -0
  247. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_bigquery.py +0 -0
  248. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_dax.py +0 -0
  249. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_dremio.py +0 -0
  250. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_drill.py +0 -0
  251. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_druid.py +0 -0
  252. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_dune.py +0 -0
  253. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_exasol.py +0 -0
  254. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_hive.py +0 -0
  255. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_materialize.py +0 -0
  256. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_oracle.py +0 -0
  257. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_pipe_syntax.py +0 -0
  258. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_postgres.py +0 -0
  259. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_prql.py +0 -0
  260. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_risingwave.py +0 -0
  261. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_solr.py +0 -0
  262. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_starrocks.py +0 -0
  263. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_tableau.py +0 -0
  264. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/dialects/test_teradata.py +0 -0
  265. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/identity.sql +0 -0
  266. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/jsonpath/LICENSE +0 -0
  267. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/jsonpath/cts.json +0 -0
  268. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
  269. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
  270. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/canonicalize_internal_names.sql +0 -0
  271. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
  272. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
  273. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
  274. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
  275. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
  276. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/normalize.sql +0 -0
  277. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
  278. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
  279. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
  280. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/qualify_columns.sql +0 -0
  281. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
  282. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
  283. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
  284. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
  285. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
  286. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
  287. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
  288. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
  289. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
  290. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
  291. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
  292. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
  293. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
  294. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
  295. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
  296. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
  297. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
  298. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
  299. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
  300. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
  301. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
  302. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
  303. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
  304. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
  305. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
  306. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
  307. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
  308. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
  309. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
  310. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
  311. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
  312. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
  313. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
  314. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
  315. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
  316. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
  317. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
  318. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
  319. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
  320. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/partial.sql +0 -0
  321. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/fixtures/pretty.sql +0 -0
  322. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/gen_fixtures.py +0 -0
  323. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/sqlglot/__init__.py +0 -0
  324. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_anonymize.py +0 -0
  325. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_build.py +0 -0
  326. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_dialect_entry_points.py +0 -0
  327. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_dialect_imports.py +0 -0
  328. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_diff.py +0 -0
  329. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_docs.py +0 -0
  330. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_errors.py +0 -0
  331. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_helper.py +0 -0
  332. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_integration_loader.py +0 -0
  333. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_lineage.py +0 -0
  334. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_schema.py +0 -0
  335. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_time.py +0 -0
  336. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_tokens.py +0 -0
  337. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_transforms.py +0 -0
  338. {sqlglot-30.18.0 → sqlglot-30.19.0}/tests/test_transpile.py +0 -0
  339. {sqlglot-30.18.0 → sqlglot-30.19.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,237 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ ## [v30.18.0] - 2026-09-03
5
+ ### :boom: BREAKING CHANGES
6
+ - 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))*:
7
+
8
+ annotate decode for postgres (#8157)
9
+
10
+ - 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))*:
11
+
12
+ map JSONB_CONTAINS to @>, add JSONBContainsTopKey (#8156)
13
+
14
+ - 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))*:
15
+
16
+ do not normalize identifiers that name data rather than references (#8161)
17
+
18
+ - 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))*:
19
+
20
+ parse BTRIM as TRIM (#8181)
21
+
22
+ - 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))*:
23
+
24
+ annotate Left function for posrgres (#8189)
25
+
26
+ - 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))*:
27
+
28
+ Annotate Reverse function for Postgres (#8201)
29
+
30
+ - 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))*:
31
+
32
+ annotate Overlay function for Postgres (#8200)
33
+
34
+ - 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))*:
35
+
36
+ Annotate Right function for Postgres (#8203)
37
+
38
+ - 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))*:
39
+
40
+ Annotate Rpad function for Postgres (#8204)
41
+
42
+ - 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))*:
43
+
44
+ Annotate SplitPart function for Postgres (#8205)
45
+
46
+ - 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))*:
47
+
48
+ Annotate To_Hex function for Postgres (#8206)
49
+
50
+ - 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))*:
51
+
52
+ Annotate Format function for Postgres (#8207)
53
+
54
+ - 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))*:
55
+
56
+ Annotate Normalize function for Postgres (#8208)
57
+
58
+ - 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))*:
59
+
60
+ Annotate ToNumber function for Postgres (#8210)
61
+
62
+ - 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))*:
63
+
64
+ ANALYZE and DROP with multiple tables (#8229)
65
+
66
+ - 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))*:
67
+
68
+ annotate maketime for postgres (#8253)
69
+
70
+ - 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))*:
71
+
72
+ annotate regexpreplace for postgres (#8256)
73
+
74
+ - 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))*:
75
+
76
+ annotate make_timestamp for postgres (#8258)
77
+
78
+ - 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))*:
79
+
80
+ annotate bit_or for postgres (#8264)
81
+
82
+ - 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))*:
83
+
84
+ Parse MOD at multiplicative precedence (#8259)
85
+
86
+ - 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))*:
87
+
88
+ annotate function bit_xor for postgres (#8274)
89
+
90
+ - 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))*:
91
+
92
+ keep the `COALESCE` wrapping when `CONCAT` is generated as `||` (#8283)
93
+
94
+ - 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))*:
95
+
96
+ don't push WHERE predicates into sources a later RIGHT or FULL join null-extends [CLAUDE] (#8282)
97
+
98
+ - 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))*:
99
+
100
+ annotate localtimestamp for postgres (#8295)
101
+
102
+ - 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))*:
103
+
104
+ normalize DATE_PART unit casing to match EXTRACT [CLAUDE] (#8293)
105
+
106
+ - 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))*:
107
+
108
+ stop dropping structured types on CREATE TABLE [GROK] (#8299)
109
+
110
+ - 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))*:
111
+
112
+ mod generation precedence (#8290)
113
+
114
+
115
+ ### :sparkles: New Features
116
+ - [`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))*
117
+ - [`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))*
118
+ - [`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))*
119
+ - [`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))*
120
+ - [`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))*
121
+ - [`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))*
122
+ - [`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))*
123
+ - [`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))*
124
+ - :arrow_lower_right: *addresses issue [#8175](https://github.com/tobymao/sqlglot/issues/8175) opened by [@sayantan-wisdom](https://github.com/sayantan-wisdom)*
125
+ - [`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))*
126
+ - [`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))*
127
+ - [`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))*
128
+ - [`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))*
129
+ - [`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))*
130
+ - [`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))*
131
+ - [`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))*
132
+ - [`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))*
133
+ - [`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))*
134
+ - [`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))*
135
+ - [`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))*
136
+ - [`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))*
137
+ - [`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))*
138
+ - [`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))*
139
+ - [`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))*
140
+ - [`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))*
141
+ - [`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))*
142
+ - [`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))*
143
+ - [`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))*
144
+ - [`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))*
145
+ - :arrow_lower_right: *addresses issue [#8277](https://github.com/tobymao/sqlglot/issues/8277) opened by [@jerryhu1234](https://github.com/jerryhu1234)*
146
+ - [`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))*
147
+ - [`2e86ded`](https://github.com/tobymao/sqlglot/commit/2e86ded7d0f6474e9041882058358616fb911464) - **teradata**: `mod()` func syntax *(commit by [@georgesittas](https://github.com/georgesittas))*
148
+
149
+ ### :bug: Bug Fixes
150
+ - [`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))*
151
+ - [`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))*
152
+ - [`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))*
153
+ - :arrow_lower_right: *fixes issue [#8152](https://github.com/tobymao/sqlglot/issues/8152) opened by [@RogerHYang](https://github.com/RogerHYang)*
154
+ - [`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))*
155
+ - [`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))*
156
+ - [`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))*
157
+ - [`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))*
158
+ - [`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))*
159
+ - :arrow_lower_right: *fixes issue [#8172](https://github.com/tobymao/sqlglot/issues/8172) opened by [@eeshsaxena](https://github.com/eeshsaxena)*
160
+ - [`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))*
161
+ - :arrow_lower_right: *fixes issue [#8080](https://github.com/tobymao/sqlglot/issues/8080) opened by [@RogerHYang](https://github.com/RogerHYang)*
162
+ - [`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))*
163
+ - [`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))*
164
+ - [`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))*
165
+ - [`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))*
166
+ - [`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))*
167
+ - [`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))*
168
+ - [`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))*
169
+ - [`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))*
170
+ - [`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))*
171
+ - [`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))*
172
+ - [`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))*
173
+ - :arrow_lower_right: *fixes issue [#8222](https://github.com/tobymao/sqlglot/issues/8222) opened by [@guijinxin](https://github.com/guijinxin)*
174
+ - [`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))*
175
+ - :arrow_lower_right: *fixes issue [#8227](https://github.com/tobymao/sqlglot/issues/8227) opened by [@guijinxin](https://github.com/guijinxin)*
176
+ - [`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))*
177
+ - [`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))*
178
+ - :arrow_lower_right: *fixes issue [#8225](https://github.com/tobymao/sqlglot/issues/8225) opened by [@guijinxin](https://github.com/guijinxin)*
179
+ - [`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))*
180
+ - [`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))*
181
+ - [`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))*
182
+ - :arrow_lower_right: *fixes issue [#8232](https://github.com/tobymao/sqlglot/issues/8232) opened by [@RogerHYang](https://github.com/RogerHYang)*
183
+ - [`2a46a03`](https://github.com/tobymao/sqlglot/commit/2a46a03311aa014e645f26bf4d8ad87ee590bf3a) - **clickhouse**: generate native lag/lead instead of lagInFrame/leadInFrame *(commit by [@tobymao](https://github.com/tobymao))*
184
+ - [`40f285c`](https://github.com/tobymao/sqlglot/commit/40f285cb61edff4a40950fc708e79ae4e8ed583d) - **clickhouse**: preserve multi-array arrayMap and arrayFilter *(commit by [@tobymao](https://github.com/tobymao))*
185
+ - [`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))*
186
+ - :arrow_lower_right: *fixes issue [#8244](https://github.com/tobymao/sqlglot/issues/8244) opened by [@xiayaoshun](https://github.com/xiayaoshun)*
187
+ - [`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))*
188
+ - :arrow_lower_right: *fixes issue [#8245](https://github.com/tobymao/sqlglot/issues/8245) opened by [@paddy-devan](https://github.com/paddy-devan)*
189
+ - [`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))*
190
+ - :arrow_lower_right: *fixes issue [#8249](https://github.com/tobymao/sqlglot/issues/8249) opened by [@RogerHYang](https://github.com/RogerHYang)*
191
+ - [`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))*
192
+ - :arrow_lower_right: *fixes issue [#8262](https://github.com/tobymao/sqlglot/issues/8262) opened by [@ishaan-upadhyay](https://github.com/ishaan-upadhyay)*
193
+ - [`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))*
194
+ - [`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))*
195
+ - [`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))*
196
+ - :arrow_lower_right: *fixes issue [#8209](https://github.com/tobymao/sqlglot/issues/8209) opened by [@glaziermag](https://github.com/glaziermag)*
197
+ - [`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))*
198
+ - :arrow_lower_right: *fixes issue [#8268](https://github.com/tobymao/sqlglot/issues/8268) opened by [@chaitanyaatlan](https://github.com/chaitanyaatlan)*
199
+ - [`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))*
200
+ - [`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))*
201
+ - [`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))*
202
+ - [`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))*
203
+ - :arrow_lower_right: *fixes issue [#8279](https://github.com/tobymao/sqlglot/issues/8279) opened by [@RogerHYang](https://github.com/RogerHYang)*
204
+ - [`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))*
205
+ - :arrow_lower_right: *fixes issue [#8280](https://github.com/tobymao/sqlglot/issues/8280) opened by [@RogerHYang](https://github.com/RogerHYang)*
206
+ - [`e2f4ad7`](https://github.com/tobymao/sqlglot/commit/e2f4ad7d50cb764c78da69b5ca7933c69156ebaa) - **redshift**: preserve quoting of the one-byte "char" type *(commit by [@georgesittas](https://github.com/georgesittas))*
207
+ - [`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))*
208
+ - :arrow_lower_right: *fixes issue [#8292](https://github.com/tobymao/sqlglot/issues/8292) opened by [@PhuocOng](https://github.com/PhuocOng)*
209
+ - [`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))*
210
+ - :arrow_lower_right: *fixes issue [#8266](https://github.com/tobymao/sqlglot/issues/8266) opened by [@wwzhe007](https://github.com/wwzhe007)*
211
+ - [`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))*
212
+ - :arrow_lower_right: *fixes issue [#8297](https://github.com/tobymao/sqlglot/issues/8297) opened by [@krishnakaanchan-png](https://github.com/krishnakaanchan-png)*
213
+ - [`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))*
214
+ - :arrow_lower_right: *fixes issue [#8298](https://github.com/tobymao/sqlglot/issues/8298) opened by [@ishaan-upadhyay](https://github.com/ishaan-upadhyay)*
215
+ - [`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))*
216
+ - [`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))*
217
+
218
+ ### :zap: Performance Improvements
219
+ - [`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))*
220
+
221
+ ### :recycle: Refactors
222
+ - [`829c2b1`](https://github.com/tobymao/sqlglot/commit/829c2b1c7061cbdc6c65ae7ea13dea73aa12522a) - clean up nth_value from [first|last] support *(commit by [@georgesittas](https://github.com/georgesittas))*
223
+ - [`b11c3d9`](https://github.com/tobymao/sqlglot/commit/b11c3d915ca617ea6f343b0c7cc4b392766fdaa0) - **optimizer**: clean up `pushdown_projections` *(commit by [@georgesittas](https://github.com/georgesittas))*
224
+
225
+ ### :white_check_mark: Tests
226
+ - [`ceb5111`](https://github.com/tobymao/sqlglot/commit/ceb5111421e9aa6135f7c650c1995ee19f9528a2) - **clickhouse**: pin the trim renderings for non-ClickHouse targets *(commit by [@tobymao](https://github.com/tobymao))*
227
+ - [`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))*
228
+
229
+ ### :wrench: Chores
230
+ - [`a04d327`](https://github.com/tobymao/sqlglot/commit/a04d327b10902537a414f0fa64f91afa1e622e32) - **parser**: clean up multi-table DROP TABLE *(commit by [@geooo109](https://github.com/geooo109))*
231
+ - [`d002d4d`](https://github.com/tobymao/sqlglot/commit/d002d4dac34967ff10df31557b278a427e63428d) - **clickhouse**: tidy up the trim builders and tests *(commit by [@tobymao](https://github.com/tobymao))*
232
+ - [`37362f4`](https://github.com/tobymao/sqlglot/commit/37362f4fc1d63c4687149cec3a8aab109c1eb989) - simplify TRIMBOTH parsing for ck *(commit by [@geooo109](https://github.com/geooo109))*
233
+
234
+
4
235
  ## [v30.17.0] - 2026-08-12
5
236
  ### :boom: BREAKING CHANGES
6
237
  - 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 +15715,4 @@ pip install "sqlglot[c]" # compiled — faster, but no subclassing
15484
15715
  [v30.14.0]: https://github.com/tobymao/sqlglot/compare/v30.13.0...v30.14.0
15485
15716
  [v30.16.0]: https://github.com/tobymao/sqlglot/compare/v30.15.0...v30.16.0
15486
15717
  [v30.17.0]: https://github.com/tobymao/sqlglot/compare/v30.16.0...v30.17.0
15718
+ [v30.18.0]: https://github.com/tobymao/sqlglot/compare/v30.17.0...v30.18.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.19.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.19.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.19.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.19.0'
22
+ __version_tuple__ = version_tuple = (30, 19, 0)
23
23
 
24
- __commit_id__ = commit_id = 'g2e86ded7d'
24
+ __commit_id__ = commit_id = 'g025622283'
@@ -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
@@ -17,6 +17,8 @@ class SQLite(Dialect):
17
17
  TYPED_DIVISION = True
18
18
  SAFE_DIVISION = True
19
19
  SAFE_TO_ELIMINATE_DOUBLE_NEGATION = False
20
+ CONCAT_COALESCE = True
21
+ CONCAT_WS_COALESCE = True
20
22
 
21
23
  class Tokenizer(tokens.Tokenizer):
22
24
  IDENTIFIERS = ['"', ("[", "]"), "`"]
@@ -204,6 +204,10 @@ def interval(this, unit):
204
204
  return datetime.timedelta(**{unit.lower(): float(this)})
205
205
 
206
206
 
207
+ def zip_not_null(*args):
208
+ return (row for row in zip(*args) if all(v is not None for v in row))
209
+
210
+
207
211
  @null_if_any
208
212
  def arrayconcat(*args):
209
213
  result = []
@@ -241,6 +245,7 @@ ENV = {
241
245
  "ARRAYUNIQUEAGG": filter_nulls(lambda acc: list(set(acc))),
242
246
  "AVG": filter_nulls(statistics.fmean if PYTHON_VERSION >= (3, 8) else statistics.mean), # type: ignore
243
247
  "COUNT": filter_nulls(lambda acc: sum(1 for _ in acc), False),
248
+ "FIRST": lambda acc: next(iter(acc), None),
244
249
  "MAX": filter_nulls(max),
245
250
  "MIN": filter_nulls(min),
246
251
  "SUM": filter_nulls(sum),
@@ -299,6 +304,7 @@ ENV = {
299
304
  "SUBSTRING": substring,
300
305
  "TIMESTRTOTIME": null_if_any(lambda arg: datetime.datetime.fromisoformat(arg)),
301
306
  "UPPER": null_if_any(lambda arg: arg.upper()),
307
+ "ZIPNOTNULL": zip_not_null,
302
308
  "YEAR": null_if_any(lambda arg: arg.year),
303
309
  "MONTH": null_if_any(lambda arg: arg.month),
304
310
  "DAY": null_if_any(lambda arg: arg.day),
@@ -49,3 +49,6 @@ from sqlglot.helper import subclasses
49
49
  ALL_FUNCTIONS = subclasses(__name__, Func, {AggFunc, Anonymous, Func})
50
50
  FUNCTION_BY_NAME = {name: func for func in ALL_FUNCTIONS for name in func.sql_names()}
51
51
  EXPR_CLASSES: dict[str, type[Expr]] = {cls.key: cls for cls in subclasses(__name__, Expr)}
52
+
53
+ # Functions that can return multiple rows. We include anonymous functions conservatively.
54
+ SET_RETURNING_FUNCTIONS = (Anonymous, UDTF, ExplodingGenerateSeries)
@@ -5,6 +5,12 @@ from __future__ import annotations
5
5
  from sqlglot.expressions.core import Expression, Func, AggFunc, Binary
6
6
 
7
7
 
8
+ class Agg(Expression, AggFunc):
9
+ @property
10
+ def output_name(self) -> str:
11
+ return self.this.name
12
+
13
+
8
14
  class AIAgg(Expression, AggFunc):
9
15
  arg_types = {"this": True, "expression": True}
10
16
  _sql_names = ["AI_AGG"]
@@ -240,10 +240,15 @@ class Explode(Expression, Func, UDTF):
240
240
  is_var_len_args = True
241
241
 
242
242
 
243
- class Inline(Expression, Func):
243
+ class Inline(Expression, Func, UDTF):
244
244
  pass
245
245
 
246
246
 
247
+ class Stack(Expression, Func, UDTF):
248
+ arg_types = {"this": True, "expressions": True}
249
+ is_var_len_args = True
250
+
251
+
247
252
  @trait
248
253
  class ExplodeOuter(Expr):
249
254
  pass
@@ -1828,6 +1828,10 @@ class Identifier(Expression):
1828
1828
  class DynamicIdentifier(Expression, Func):
1829
1829
  arg_types = {"this": True, "expressions": False}
1830
1830
 
1831
+ @property
1832
+ def name(self) -> str:
1833
+ return self.this.name if self.this else ""
1834
+
1831
1835
 
1832
1836
  class Opclass(Expression):
1833
1837
  arg_types = {"this": True, "expression": True}
@@ -240,6 +240,10 @@ class OpenJSON(Expression, Func):
240
240
  arg_types = {"this": True, "path": False, "expressions": False}
241
241
 
242
242
 
243
+ class FromJson(Expression, Func):
244
+ arg_types = {"this": True, "expression": True, "options": False}
245
+
246
+
243
247
  class ParseJSON(Expression, Func):
244
248
  # BigQuery, Snowflake have PARSE_JSON, Presto has JSON_PARSE
245
249
  # Snowflake also has TRY_PARSE_JSON, which is represented using `safe`
@@ -12,6 +12,7 @@ from sqlglot.expressions.core import (
12
12
  Condition,
13
13
  Distinct,
14
14
  Dot,
15
+ DynamicIdentifier,
15
16
  Expr,
16
17
  Expression,
17
18
  Func,
@@ -624,7 +625,6 @@ class Group(Expression):
624
625
  arg_types = {
625
626
  "expressions": False,
626
627
  "grouping_sets": False,
627
- "grouping_sets_as_group_by_element": False,
628
628
  "cube": False,
629
629
  "rollup": False,
630
630
  "totals": False,
@@ -967,9 +967,10 @@ class Table(Expression, Selectable):
967
967
 
968
968
  @property
969
969
  def name(self) -> str:
970
- if not self.this or isinstance(self.this, Func):
970
+ this = self.this
971
+ if not this or (isinstance(this, Func) and not isinstance(this, DynamicIdentifier)):
971
972
  return ""
972
- return self.this.name
973
+ return this.name
973
974
 
974
975
  @property
975
976
  def db(self) -> str:
@@ -1019,6 +1020,20 @@ class Table(Expression, Selectable):
1019
1020
  return col
1020
1021
 
1021
1022
 
1023
+ def _is_star(expression: Expr) -> bool:
1024
+ stack = [expression]
1025
+ while stack:
1026
+ node = stack.pop()
1027
+ if isinstance(node, SetOperation):
1028
+ stack.append(node.this)
1029
+ stack.append(node.expression)
1030
+ elif isinstance(node, Subquery):
1031
+ stack.append(node.this)
1032
+ elif node.is_star:
1033
+ return True
1034
+ return False
1035
+
1036
+
1022
1037
  class SetOperation(Expression, Query):
1023
1038
  arg_types = {
1024
1039
  "with_": False,
@@ -1061,7 +1076,7 @@ class SetOperation(Expression, Query):
1061
1076
 
1062
1077
  @property
1063
1078
  def is_star(self) -> bool:
1064
- return self.this.is_star or self.expression.is_star
1079
+ return _is_star(self)
1065
1080
 
1066
1081
  @property
1067
1082
  def selects(self) -> list[Expr]:
@@ -1719,7 +1734,7 @@ class Subquery(Expression, DerivedTable, Query):
1719
1734
 
1720
1735
  @property
1721
1736
  def is_star(self) -> bool:
1722
- return self.this.is_star
1737
+ return _is_star(self)
1723
1738
 
1724
1739
  @property
1725
1740
  def output_name(self) -> str:
@@ -32,6 +32,7 @@ class Concat(Expression, Func):
32
32
 
33
33
 
34
34
  class ConcatWs(Concat):
35
+ arg_types = {**Concat.arg_types, "flatten": False}
35
36
  _sql_names = ["CONCAT_WS"]
36
37
 
37
38