sqlglot 30.11.0__tar.gz → 30.13.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 (337) hide show
  1. {sqlglot-30.11.0 → sqlglot-30.13.0}/CHANGELOG.md +147 -0
  2. {sqlglot-30.11.0 → sqlglot-30.13.0}/CONTRIBUTING.md +26 -0
  3. {sqlglot-30.11.0 → sqlglot-30.13.0}/Makefile +5 -1
  4. {sqlglot-30.11.0/sqlglot.egg-info → sqlglot-30.13.0}/PKG-INFO +5 -4
  5. {sqlglot-30.11.0 → sqlglot-30.13.0}/README.md +1 -0
  6. {sqlglot-30.11.0 → sqlglot-30.13.0}/setup.py +1 -1
  7. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/_version.py +3 -3
  8. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/__init__.py +1 -0
  9. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/clickhouse.py +1 -0
  10. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/databricks.py +2 -0
  11. sqlglot-30.13.0/sqlglot/dialects/dax.py +20 -0
  12. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/dialect.py +70 -10
  13. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/dremio.py +6 -0
  14. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/hive.py +3 -2
  15. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/postgres.py +6 -0
  16. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/snowflake.py +3 -0
  17. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/spark.py +3 -0
  18. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/spark2.py +3 -0
  19. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/expressions/aggregate.py +5 -4
  20. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/expressions/array.py +4 -0
  21. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/expressions/constraints.py +5 -0
  22. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/expressions/core.py +23 -10
  23. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/expressions/ddl.py +9 -1
  24. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/expressions/json.py +4 -0
  25. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/expressions/math.py +4 -0
  26. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/expressions/properties.py +5 -1
  27. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/expressions/query.py +2 -2
  28. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/expressions/string.py +11 -0
  29. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/expressions/temporal.py +19 -4
  30. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generator.py +91 -28
  31. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/bigquery.py +30 -0
  32. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/clickhouse.py +4 -1
  33. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/databricks.py +14 -0
  34. sqlglot-30.13.0/sqlglot/generators/dax.py +7 -0
  35. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/dremio.py +8 -0
  36. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/drill.py +17 -1
  37. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/duckdb.py +174 -55
  38. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/exasol.py +1 -3
  39. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/hive.py +78 -27
  40. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/mysql.py +4 -0
  41. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/oracle.py +1 -0
  42. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/postgres.py +9 -3
  43. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/presto.py +66 -5
  44. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/snowflake.py +72 -2
  45. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/spark.py +0 -1
  46. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/spark2.py +23 -0
  47. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/sqlite.py +6 -1
  48. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/starrocks.py +15 -1
  49. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/trino.py +1 -0
  50. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/tsql.py +5 -2
  51. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/annotate_types.py +22 -8
  52. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/canonicalize_internal_names.py +19 -6
  53. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/merge_subqueries.py +98 -18
  54. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/pushdown_predicates.py +4 -0
  55. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/pushdown_projections.py +18 -0
  56. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/qualify_columns.py +105 -25
  57. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/qualify_tables.py +7 -1
  58. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/resolver.py +27 -10
  59. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/scope.py +4 -2
  60. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/simplify.py +59 -27
  61. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parser.py +177 -80
  62. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/bigquery.py +40 -21
  63. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/clickhouse.py +15 -1
  64. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/databricks.py +16 -0
  65. sqlglot-30.13.0/sqlglot/parsers/dax.py +48 -0
  66. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/drill.py +8 -0
  67. sqlglot-30.13.0/sqlglot/parsers/druid.py +10 -0
  68. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/duckdb.py +4 -0
  69. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/exasol.py +4 -3
  70. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/hive.py +2 -18
  71. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/mysql.py +3 -0
  72. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/oracle.py +5 -2
  73. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/postgres.py +1 -0
  74. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/presto.py +6 -2
  75. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/snowflake.py +80 -7
  76. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/spark2.py +1 -1
  77. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/starrocks.py +4 -1
  78. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/tsql.py +10 -0
  79. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/time.py +23 -23
  80. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/tokenizer_core.py +14 -3
  81. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/tokens.py +10 -26
  82. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/typing/__init__.py +6 -4
  83. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/typing/bigquery.py +42 -4
  84. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/typing/clickhouse.py +5 -0
  85. sqlglot-30.13.0/sqlglot/typing/databricks.py +38 -0
  86. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/typing/duckdb.py +7 -0
  87. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/typing/hive.py +7 -2
  88. sqlglot-30.13.0/sqlglot/typing/mysql.py +79 -0
  89. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/typing/snowflake.py +0 -1
  90. {sqlglot-30.11.0 → sqlglot-30.13.0/sqlglot.egg-info}/PKG-INFO +5 -4
  91. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot.egg-info/SOURCES.txt +7 -0
  92. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot.egg-info/requires.txt +3 -3
  93. sqlglot-30.13.0/sqlglot.egg-info/scm_file_list.json +359 -0
  94. sqlglot-30.13.0/sqlglot.egg-info/scm_version.json +8 -0
  95. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglotc/pyproject.toml +2 -2
  96. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglotc/setup.py +7 -0
  97. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_bigquery.py +94 -6
  98. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_clickhouse.py +28 -0
  99. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_databricks.py +13 -2
  100. sqlglot-30.13.0/tests/dialects/test_dax.py +55 -0
  101. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_dialect.py +82 -8
  102. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_dremio.py +33 -0
  103. sqlglot-30.13.0/tests/dialects/test_drill.py +65 -0
  104. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_druid.py +6 -0
  105. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_duckdb.py +97 -6
  106. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_exasol.py +24 -8
  107. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_hive.py +7 -2
  108. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_mysql.py +2 -1
  109. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_oracle.py +23 -1
  110. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_postgres.py +65 -6
  111. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_presto.py +64 -6
  112. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_redshift.py +6 -4
  113. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_snowflake.py +104 -6
  114. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_spark.py +57 -3
  115. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_sqlite.py +26 -0
  116. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_starrocks.py +94 -0
  117. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_teradata.py +2 -2
  118. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_trino.py +11 -0
  119. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_tsql.py +8 -3
  120. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/identity.sql +25 -3
  121. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/annotate_functions.sql +539 -0
  122. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/merge_subqueries.sql +69 -2
  123. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/optimizer.sql +1 -1
  124. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/pushdown_predicates.sql +12 -0
  125. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/pushdown_projections.sql +4 -4
  126. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/qualify_columns.sql +49 -2
  127. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/qualify_tables.sql +5 -0
  128. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/simplify.sql +46 -1
  129. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_optimizer.py +281 -5
  130. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_parser.py +103 -0
  131. sqlglot-30.13.0/tests/test_time.py +76 -0
  132. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_transpile.py +46 -4
  133. sqlglot-30.11.0/sqlglot/parsers/druid.py +0 -7
  134. sqlglot-30.11.0/sqlglot/typing/mysql.py +0 -35
  135. sqlglot-30.11.0/tests/dialects/test_drill.py +0 -25
  136. sqlglot-30.11.0/tests/test_time.py +0 -34
  137. {sqlglot-30.11.0 → sqlglot-30.13.0}/.gitignore +0 -0
  138. {sqlglot-30.11.0 → sqlglot-30.13.0}/.gitmodules +0 -0
  139. {sqlglot-30.11.0 → sqlglot-30.13.0}/.gitpod.yml +0 -0
  140. {sqlglot-30.11.0 → sqlglot-30.13.0}/.pre-commit-config.yaml +0 -0
  141. {sqlglot-30.11.0 → sqlglot-30.13.0}/AGENTS.md +0 -0
  142. {sqlglot-30.11.0 → sqlglot-30.13.0}/CLAUDE.md +0 -0
  143. {sqlglot-30.11.0 → sqlglot-30.13.0}/LICENSE +0 -0
  144. {sqlglot-30.11.0 → sqlglot-30.13.0}/MANIFEST.in +0 -0
  145. {sqlglot-30.11.0 → sqlglot-30.13.0}/pyproject.toml +0 -0
  146. {sqlglot-30.11.0 → sqlglot-30.13.0}/setup.cfg +0 -0
  147. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/__init__.py +0 -0
  148. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/__main__.py +0 -0
  149. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/_typing.py +0 -0
  150. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/athena.py +0 -0
  151. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/bigquery.py +0 -0
  152. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/doris.py +0 -0
  153. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/drill.py +0 -0
  154. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/druid.py +0 -0
  155. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/duckdb.py +0 -0
  156. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/dune.py +0 -0
  157. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/exasol.py +0 -0
  158. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/fabric.py +0 -0
  159. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/materialize.py +0 -0
  160. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/mysql.py +0 -0
  161. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/oracle.py +0 -0
  162. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/presto.py +0 -0
  163. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/prql.py +0 -0
  164. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/redshift.py +0 -0
  165. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/risingwave.py +0 -0
  166. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/singlestore.py +0 -0
  167. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/solr.py +0 -0
  168. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/sqlite.py +0 -0
  169. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/starrocks.py +0 -0
  170. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/tableau.py +0 -0
  171. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/teradata.py +0 -0
  172. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/trino.py +0 -0
  173. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/dialects/tsql.py +0 -0
  174. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/diff.py +0 -0
  175. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/errors.py +0 -0
  176. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/executor/__init__.py +0 -0
  177. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/executor/context.py +0 -0
  178. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/executor/env.py +0 -0
  179. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/executor/python.py +0 -0
  180. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/executor/table.py +0 -0
  181. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/expressions/__init__.py +0 -0
  182. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/expressions/builders.py +0 -0
  183. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/expressions/datatypes.py +0 -0
  184. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/expressions/dml.py +0 -0
  185. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/expressions/functions.py +0 -0
  186. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/__init__.py +0 -0
  187. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/athena.py +0 -0
  188. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/doris.py +0 -0
  189. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/druid.py +0 -0
  190. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/dune.py +0 -0
  191. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/fabric.py +0 -0
  192. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/materialize.py +0 -0
  193. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/prql.py +0 -0
  194. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/python.py +0 -0
  195. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/redshift.py +0 -0
  196. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/risingwave.py +0 -0
  197. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/singlestore.py +0 -0
  198. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/solr.py +0 -0
  199. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/tableau.py +0 -0
  200. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/generators/teradata.py +0 -0
  201. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/helper.py +0 -0
  202. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/jsonpath.py +0 -0
  203. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/lineage.py +0 -0
  204. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/__init__.py +0 -0
  205. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/canonicalize.py +0 -0
  206. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
  207. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
  208. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
  209. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  210. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/normalize.py +0 -0
  211. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  212. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/optimize_joins.py +0 -0
  213. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/optimizer.py +0 -0
  214. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/qualify.py +0 -0
  215. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/optimizer/unnest_subqueries.py +0 -0
  216. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/__init__.py +0 -0
  217. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/athena.py +0 -0
  218. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/base.py +0 -0
  219. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/doris.py +0 -0
  220. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/dremio.py +0 -0
  221. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/dune.py +0 -0
  222. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/fabric.py +0 -0
  223. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/materialize.py +0 -0
  224. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/prql.py +0 -0
  225. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/redshift.py +0 -0
  226. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/risingwave.py +0 -0
  227. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/singlestore.py +0 -0
  228. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/solr.py +0 -0
  229. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/spark.py +0 -0
  230. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/sqlite.py +0 -0
  231. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/tableau.py +0 -0
  232. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/teradata.py +0 -0
  233. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/parsers/trino.py +0 -0
  234. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/planner.py +0 -0
  235. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/py.typed +0 -0
  236. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/schema.py +0 -0
  237. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/serde.py +0 -0
  238. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/transforms.py +0 -0
  239. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/trie.py +0 -0
  240. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/typing/postgres.py +0 -0
  241. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/typing/presto.py +0 -0
  242. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/typing/redshift.py +0 -0
  243. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/typing/spark.py +0 -0
  244. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/typing/spark2.py +0 -0
  245. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot/typing/tsql.py +0 -0
  246. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot.egg-info/dependency_links.txt +0 -0
  247. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot.egg-info/top_level.txt +0 -0
  248. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglot.png +0 -0
  249. {sqlglot-30.11.0 → sqlglot-30.13.0}/sqlglotc/MANIFEST.in +0 -0
  250. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/__init__.py +0 -0
  251. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/__init__.py +0 -0
  252. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_athena.py +0 -0
  253. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_doris.py +0 -0
  254. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_dune.py +0 -0
  255. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_fabric.py +0 -0
  256. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_materialize.py +0 -0
  257. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_pipe_syntax.py +0 -0
  258. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_prql.py +0 -0
  259. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_risingwave.py +0 -0
  260. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_singlestore.py +0 -0
  261. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_solr.py +0 -0
  262. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/dialects/test_tableau.py +0 -0
  263. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/jsonpath/LICENSE +0 -0
  264. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/jsonpath/cts.json +0 -0
  265. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
  266. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
  267. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/canonicalize_internal_names.sql +0 -0
  268. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
  269. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
  270. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
  271. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
  272. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/normalize.sql +0 -0
  273. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
  274. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
  275. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
  276. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
  277. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
  278. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
  279. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
  280. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
  281. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
  282. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
  283. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
  284. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
  285. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
  286. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
  287. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
  288. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
  289. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
  290. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
  291. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
  292. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
  293. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
  294. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
  295. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
  296. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
  297. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
  298. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
  299. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
  300. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
  301. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
  302. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
  303. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
  304. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
  305. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
  306. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
  307. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
  308. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
  309. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
  310. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
  311. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
  312. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
  313. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
  314. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
  315. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/partial.sql +0 -0
  316. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/fixtures/pretty.sql +0 -0
  317. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/gen_fixtures.py +0 -0
  318. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/helpers.py +0 -0
  319. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/leakcheck.py +0 -0
  320. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/sqlglot/__init__.py +0 -0
  321. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_build.py +0 -0
  322. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_dialect_entry_points.py +0 -0
  323. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_dialect_imports.py +0 -0
  324. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_diff.py +0 -0
  325. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_docs.py +0 -0
  326. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_errors.py +0 -0
  327. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_executor.py +0 -0
  328. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_expressions.py +0 -0
  329. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_generator.py +0 -0
  330. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_helper.py +0 -0
  331. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_integration_loader.py +0 -0
  332. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_jsonpath.py +0 -0
  333. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_lineage.py +0 -0
  334. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_schema.py +0 -0
  335. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_serde.py +0 -0
  336. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_tokens.py +0 -0
  337. {sqlglot-30.11.0 → sqlglot-30.13.0}/tests/test_transforms.py +0 -0
@@ -1,6 +1,151 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ ## [v30.12.0] - 2026-06-26
5
+ ### :boom: BREAKING CHANGES
6
+ - due to [`d0ebc83`](https://github.com/tobymao/sqlglot/commit/d0ebc8353a3be4eb3258a9e078cc5e124c0e8c78) - Annotate MINUTE function *(PR [#7747](https://github.com/tobymao/sqlglot/pull/7747) by [@vishvambhar-ranoshe](https://github.com/vishvambhar-ranoshe))*:
7
+
8
+ Annotate MINUTE function (#7747)
9
+
10
+ - due to [`2e7f8b7`](https://github.com/tobymao/sqlglot/commit/2e7f8b7e6eea5301a902bacf09e00f853e6c77b5) - add UNDROP support for all Snowflake Time Travel object types *(PR [#7735](https://github.com/tobymao/sqlglot/pull/7735) by [@Danielhaiman](https://github.com/Danielhaiman))*:
11
+
12
+ add UNDROP support for all Snowflake Time Travel object types (#7735)
13
+
14
+ - due to [`87b1da8`](https://github.com/tobymao/sqlglot/commit/87b1da8f32bbdf6e5c8d5b6b3bdf454e42835740) - json extract with : roundtrip *(PR [#7750](https://github.com/tobymao/sqlglot/pull/7750) by [@geooo109](https://github.com/geooo109))*:
15
+
16
+ json extract with : roundtrip (#7750)
17
+
18
+ - due to [`dbc83df`](https://github.com/tobymao/sqlglot/commit/dbc83df5ed89be8576e6b93a34312b73b0673c43) - JSON path key quote granularity *(PR [#7758](https://github.com/tobymao/sqlglot/pull/7758) by [@geooo109](https://github.com/geooo109))*:
19
+
20
+ JSON path key quote granularity (#7758)
21
+
22
+ - due to [`5ad2add`](https://github.com/tobymao/sqlglot/commit/5ad2addd1ca4cd057c297519a5e5f5fe9c17131d) - preserve line breaks between consecutive comments in pretty mode *(PR [#7770](https://github.com/tobymao/sqlglot/pull/7770) by [@tobymao](https://github.com/tobymao))*:
23
+
24
+ preserve line breaks between consecutive comments in pretty mode (#7770)
25
+
26
+ - due to [`719a34c`](https://github.com/tobymao/sqlglot/commit/719a34cea6f90dae270d1f28c526ad1c0bd72354) - annotate replace for mysql *(PR [#7774](https://github.com/tobymao/sqlglot/pull/7774) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*:
27
+
28
+ annotate replace for mysql (#7774)
29
+
30
+ - due to [`4d621b2`](https://github.com/tobymao/sqlglot/commit/4d621b2d7e3c27bc95136fa6d7d0d54f96e9ff94) - Annotate Typeof for Spark/DBX *(PR [#7772](https://github.com/tobymao/sqlglot/pull/7772) by [@Anuja006](https://github.com/Anuja006))*:
31
+
32
+ Annotate Typeof for Spark/DBX (#7772)
33
+
34
+ - due to [`0971a28`](https://github.com/tobymao/sqlglot/commit/0971a287e86c46183a39f8af9b6821daa482c441) - annotate `TYPEOF` as string globally *(PR [#7781](https://github.com/tobymao/sqlglot/pull/7781) by [@georgesittas](https://github.com/georgesittas))*:
35
+
36
+ annotate `TYPEOF` as string globally (#7781)
37
+
38
+ - due to [`91a781b`](https://github.com/tobymao/sqlglot/commit/91a781b9cbe5fb1a3f401464b6ef76aab0715188) - coerce bigquery date function arg types [CLAUDE] *(PR [#7790](https://github.com/tobymao/sqlglot/pull/7790) by [@etonlels](https://github.com/etonlels))*:
39
+
40
+ coerce bigquery date function arg types [CLAUDE] (#7790)
41
+
42
+ - due to [`075eaf5`](https://github.com/tobymao/sqlglot/commit/075eaf5d8a67e24f85d282f5b8f9ba912f21025f) - annotate DIV for Hive/Spark/DBX *(PR [#7788](https://github.com/tobymao/sqlglot/pull/7788) by [@AbhishekASLK](https://github.com/AbhishekASLK))*:
43
+
44
+ annotate DIV for Hive/Spark/DBX (#7788)
45
+
46
+ - due to [`b1a0070`](https://github.com/tobymao/sqlglot/commit/b1a0070ca9989e76e30ab512f206423d5d6de0bc) - resolve lateral subquery columns *(PR [#7802](https://github.com/tobymao/sqlglot/pull/7802) by [@georgesittas](https://github.com/georgesittas))*:
47
+
48
+ resolve lateral subquery columns (#7802)
49
+
50
+ - due to [`64e268a`](https://github.com/tobymao/sqlglot/commit/64e268a5d95cd84a87ad74ef569fc9bf356fd3fb) - support arrayMap and arrayFilter roundtrips [CODEX] *(PR [#7794](https://github.com/tobymao/sqlglot/pull/7794) by [@gaoflow](https://github.com/gaoflow))*:
51
+
52
+ support arrayMap and arrayFilter roundtrips [CODEX] (#7794)
53
+
54
+
55
+ ### :sparkles: New Features
56
+ - [`a288150`](https://github.com/tobymao/sqlglot/commit/a288150655bb9ba612a299937bf451143b9869b4) - **duckdb**: Add transpilation support for TRY_CAST INTERVAL *(PR [#7731](https://github.com/tobymao/sqlglot/pull/7731) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
57
+ - [`d0ebc83`](https://github.com/tobymao/sqlglot/commit/d0ebc8353a3be4eb3258a9e078cc5e124c0e8c78) - **optimizer**: Annotate MINUTE function *(PR [#7747](https://github.com/tobymao/sqlglot/pull/7747) by [@vishvambhar-ranoshe](https://github.com/vishvambhar-ranoshe))*
58
+ - [`2e7f8b7`](https://github.com/tobymao/sqlglot/commit/2e7f8b7e6eea5301a902bacf09e00f853e6c77b5) - **snowflake**: add UNDROP support for all Snowflake Time Travel object types *(PR [#7735](https://github.com/tobymao/sqlglot/pull/7735) by [@Danielhaiman](https://github.com/Danielhaiman))*
59
+ - :arrow_lower_right: *addresses issue [#7734](https://github.com/tobymao/sqlglot/issues/7734) opened by [@Danielhaiman](https://github.com/Danielhaiman)*
60
+ - [`4804de4`](https://github.com/tobymao/sqlglot/commit/4804de4087caa73016a07daa2c2de6965c83f872) - **snowflake**: support `RENAME TO` clause in `UNDROP` statement *(commit by [@georgesittas](https://github.com/georgesittas))*
61
+ - [`72e6796`](https://github.com/tobymao/sqlglot/commit/72e6796bb8d7bdb6229ec2d1f352ba4d96ff3c71) - **duckdb**: Fix and updates tests for pivot subquery string lietral column names *(PR [#7757](https://github.com/tobymao/sqlglot/pull/7757) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
62
+ - [`78c5cf9`](https://github.com/tobymao/sqlglot/commit/78c5cf92f262b0743470d91b3a24c0bb462a4183) - **snowflake**: transpile Snowflake IDENTIFIER function to DuckDB *(PR [#7723](https://github.com/tobymao/sqlglot/pull/7723) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
63
+ - [`12eba76`](https://github.com/tobymao/sqlglot/commit/12eba761aa5839d1bfeb454abfacf9130723dae7) - **duckdb**: Add transpilation support for Snowflake STARTS WITH ... CONNECT BY *(PR [#7709](https://github.com/tobymao/sqlglot/pull/7709) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
64
+ - [`5ad2add`](https://github.com/tobymao/sqlglot/commit/5ad2addd1ca4cd057c297519a5e5f5fe9c17131d) - preserve line breaks between consecutive comments in pretty mode *(PR [#7770](https://github.com/tobymao/sqlglot/pull/7770) by [@tobymao](https://github.com/tobymao))*
65
+ - :arrow_lower_right: *addresses issue [#7764](https://github.com/tobymao/sqlglot/issues/7764) opened by [@betodealmeida](https://github.com/betodealmeida)*
66
+ - [`719a34c`](https://github.com/tobymao/sqlglot/commit/719a34cea6f90dae270d1f28c526ad1c0bd72354) - **optimizer**: annotate replace for mysql *(PR [#7774](https://github.com/tobymao/sqlglot/pull/7774) by [@PiyaDaswadkar](https://github.com/PiyaDaswadkar))*
67
+ - [`d4c74a2`](https://github.com/tobymao/sqlglot/commit/d4c74a2b62c64589a0b1261bbf623ca89da8c687) - **bigquery**: reject connected adjacent string literals closes [#7780](https://github.com/tobymao/sqlglot/pull/7780) *(commit by [@georgesittas](https://github.com/georgesittas))*
68
+ - [`4d621b2`](https://github.com/tobymao/sqlglot/commit/4d621b2d7e3c27bc95136fa6d7d0d54f96e9ff94) - **optimizer**: Annotate Typeof for Spark/DBX *(PR [#7772](https://github.com/tobymao/sqlglot/pull/7772) by [@Anuja006](https://github.com/Anuja006))*
69
+ - [`eaa3f98`](https://github.com/tobymao/sqlglot/commit/eaa3f982d435d3d0aea27019be5d1a4a9fd47fa2) - **optimizer**: move typeof annotator to hive instead of spark *(commit by [@georgesittas](https://github.com/georgesittas))*
70
+ - [`0971a28`](https://github.com/tobymao/sqlglot/commit/0971a287e86c46183a39f8af9b6821daa482c441) - **optimizer**: annotate `TYPEOF` as string globally *(PR [#7781](https://github.com/tobymao/sqlglot/pull/7781) by [@georgesittas](https://github.com/georgesittas))*
71
+ - [`2ecdfe5`](https://github.com/tobymao/sqlglot/commit/2ecdfe5cf9e0817bb2be9b2d83895e298dfbfe8a) - **duckdb**: transpile CONNECT_BY_ROOT *(commit by [@georgesittas](https://github.com/georgesittas))*
72
+ - [`6dbcf81`](https://github.com/tobymao/sqlglot/commit/6dbcf818b4cc938786c0d79f446ef9e9543f5e0e) - **optimizer**: Annotate types tests for spark2, spark, databricks ABS function *(PR [#7789](https://github.com/tobymao/sqlglot/pull/7789) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
73
+ - [`9f18b77`](https://github.com/tobymao/sqlglot/commit/9f18b7705833c54478ce990c3319d2153ecb8be9) - **parser**: support `CALLED ON NULL INPUT` function property *(PR [#7792](https://github.com/tobymao/sqlglot/pull/7792) by [@eruditmorina](https://github.com/eruditmorina))*
74
+ - :arrow_lower_right: *addresses issue [#4916](https://github.com/tobymao/sqlglot/issues/4916) opened by [@florian-ernst-alan](https://github.com/florian-ernst-alan)*
75
+ - [`523f7c2`](https://github.com/tobymao/sqlglot/commit/523f7c2551906ffc37a03b8dae0fea3a0fca783d) - **snowflake**: support properties before column definitions in `CREATE` statements *(PR [#7787](https://github.com/tobymao/sqlglot/pull/7787) by [@eruditmorina](https://github.com/eruditmorina))*
76
+ - [`075eaf5`](https://github.com/tobymao/sqlglot/commit/075eaf5d8a67e24f85d282f5b8f9ba912f21025f) - **optimizer**: annotate DIV for Hive/Spark/DBX *(PR [#7788](https://github.com/tobymao/sqlglot/pull/7788) by [@AbhishekASLK](https://github.com/AbhishekASLK))*
77
+ - [`7a0a9ab`](https://github.com/tobymao/sqlglot/commit/7a0a9abc516fd3280382f26b89adfc1547c10098) - **snowflake**: support invoking dynamically-resolved functions via `IDENTIFIER()` *(PR [#7796](https://github.com/tobymao/sqlglot/pull/7796) by [@eruditmorina](https://github.com/eruditmorina))*
78
+
79
+ ### :bug: Bug Fixes
80
+ - [`8889df9`](https://github.com/tobymao/sqlglot/commit/8889df9017160f3e72af562f5387cca9b4e6606e) - **transpile-bug**: update core, generator, optimizer, and parser files for select-star-ilike-rename *(PR [#7720](https://github.com/tobymao/sqlglot/pull/7720) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
81
+ - [`bd7a989`](https://github.com/tobymao/sqlglot/commit/bd7a9895e47781f3c7d0a66cd89bf1568f313a83) - **parser**: add single quotes escape for hive hierarchy *(PR [#7741](https://github.com/tobymao/sqlglot/pull/7741) by [@cchambers-rdi](https://github.com/cchambers-rdi))*
82
+ - [`56390d6`](https://github.com/tobymao/sqlglot/commit/56390d682ca7db5f0c6003fc15187385bea9c9b9) - **parser**: revert single quote escape for hive hierarchy *(commit by [@geooo109](https://github.com/geooo109))*
83
+ - [`27aee3e`](https://github.com/tobymao/sqlglot/commit/27aee3e66434fe50c744cfbb7bd344bfe8d69a5b) - **duckdb**: add ParseDatetime transpilation for BigQuery to DuckDB *(PR [#7704](https://github.com/tobymao/sqlglot/pull/7704) by [@william-goode](https://github.com/william-goode))*
84
+ - [`9bebfd2`](https://github.com/tobymao/sqlglot/commit/9bebfd283cb766eb5f3f2b8ccfd0ad345681f9c8) - **optimizer**: unwrap parens less aggressively in `qualify_tables` *(PR [#7742](https://github.com/tobymao/sqlglot/pull/7742) by [@georgesittas](https://github.com/georgesittas))*
85
+ - [`4c2cd15`](https://github.com/tobymao/sqlglot/commit/4c2cd15c7a66bb240a8508517bb492aa7ed6c84a) - **clickhouse**: `SETTINGS` cannot act as an alias token closes [#7749](https://github.com/tobymao/sqlglot/pull/7749) *(commit by [@georgesittas](https://github.com/georgesittas))*
86
+ - [`87b1da8`](https://github.com/tobymao/sqlglot/commit/87b1da8f32bbdf6e5c8d5b6b3bdf454e42835740) - **databricks**: json extract with : roundtrip *(PR [#7750](https://github.com/tobymao/sqlglot/pull/7750) by [@geooo109](https://github.com/geooo109))*
87
+ - [`da26192`](https://github.com/tobymao/sqlglot/commit/da261928a85d2996f77965450c710cc024505d68) - `_KEYWORD_TRIE` type annotation: keys are `str | int` *(PR [#7753](https://github.com/tobymao/sqlglot/pull/7753) by [@tobymao](https://github.com/tobymao))*
88
+ - [`8375e06`](https://github.com/tobymao/sqlglot/commit/8375e0674fc355448877c302a7e8d96eb3d27536) - **bigquery**: extend PROJECTION_ALIASES_SHADOW_SOURCE_NAMES to QUALIFY clause *(commit by [@tobymao](https://github.com/tobymao))*
89
+ - [`4ada15a`](https://github.com/tobymao/sqlglot/commit/4ada15a4291c110a6bd7c42cfa298fff0cfd4c6d) - **parser**: more robust ON CONFLICT *(PR [#7760](https://github.com/tobymao/sqlglot/pull/7760) by [@geooo109](https://github.com/geooo109))*
90
+ - :arrow_lower_right: *fixes issue [#7759](https://github.com/tobymao/sqlglot/issues/7759) opened by [@SherAndrei](https://github.com/SherAndrei)*
91
+ - [`dbc83df`](https://github.com/tobymao/sqlglot/commit/dbc83df5ed89be8576e6b93a34312b73b0673c43) - **parser**: JSON path key quote granularity *(PR [#7758](https://github.com/tobymao/sqlglot/pull/7758) by [@geooo109](https://github.com/geooo109))*
92
+ - [`02e2469`](https://github.com/tobymao/sqlglot/commit/02e24696524013da632cfd2e35f83da28b5e2947) - **postgres**: support jsonpath @? operator CODEX *(PR [#7766](https://github.com/tobymao/sqlglot/pull/7766) by [@fpatz](https://github.com/fpatz))*
93
+ - [`82f700e`](https://github.com/tobymao/sqlglot/commit/82f700e2aa8c7d9281063b889129e555f23b786d) - **postgres**: preserve ARRAY roundtrip for SET OPS *(PR [#7765](https://github.com/tobymao/sqlglot/pull/7765) by [@geooo109](https://github.com/geooo109))*
94
+ - [`bc71151`](https://github.com/tobymao/sqlglot/commit/bc7115100ec3e1a839b2a8a08813c4606826399a) - **postgres**: 1 arg UUID roundtrip *(PR [#7767](https://github.com/tobymao/sqlglot/pull/7767) by [@geooo109](https://github.com/geooo109))*
95
+ - [`31cee10`](https://github.com/tobymao/sqlglot/commit/31cee10b187359597aef88976d46233d25642d02) - **druid**: add JSON_VALUE RETURNING support *(PR [#7771](https://github.com/tobymao/sqlglot/pull/7771) by [@sitelight](https://github.com/sitelight))*
96
+ - [`499d132`](https://github.com/tobymao/sqlglot/commit/499d1321d85d99b09f62ec97a0730c61b5464e6b) - **postgres**: preserve contained-by operator direction CODEX *(PR [#7768](https://github.com/tobymao/sqlglot/pull/7768) by [@fpatz](https://github.com/fpatz))*
97
+ - [`7db4d25`](https://github.com/tobymao/sqlglot/commit/7db4d2515435ba3d0651f2bd467fca1a747be265) - **snowflake**: transpile FROM_ISO8601_TIMESTAMP to cast [CLAUDE] *(PR [#7776](https://github.com/tobymao/sqlglot/pull/7776) by [@baruchoxman](https://github.com/baruchoxman))*
98
+ - :arrow_lower_right: *fixes issue [#7775](https://github.com/tobymao/sqlglot/issues/7775) opened by [@baruchoxman](https://github.com/baruchoxman)*
99
+ - [`43a3d9f`](https://github.com/tobymao/sqlglot/commit/43a3d9fc9503e667d1979dba6131feb8851a588b) - **presto**: transpile FROM_ISO8601_DATE to cast [CLAUDE] *(PR [#7778](https://github.com/tobymao/sqlglot/pull/7778) by [@baruchoxman](https://github.com/baruchoxman))*
100
+ - :arrow_lower_right: *fixes issue [#7777](https://github.com/tobymao/sqlglot/issues/7777) opened by [@baruchoxman](https://github.com/baruchoxman)*
101
+ - [`2637c56`](https://github.com/tobymao/sqlglot/commit/2637c5696e4ce34d54600154376f400ba06d1860) - **snowflake**: preserve PATTERN clause on staged files without FILE_FORMAT *(PR [#7783](https://github.com/tobymao/sqlglot/pull/7783) by [@eruditmorina](https://github.com/eruditmorina))*
102
+ - :arrow_lower_right: *fixes issue [#7782](https://github.com/tobymao/sqlglot/issues/7782) opened by [@eruditmorina](https://github.com/eruditmorina)*
103
+ - [`9222960`](https://github.com/tobymao/sqlglot/commit/9222960cb1dfca49c4b18eb139d5a2c843f133a6) - **duckdb**: Fix lexical backslash handling *(PR [#7769](https://github.com/tobymao/sqlglot/pull/7769) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
104
+ - [`9385433`](https://github.com/tobymao/sqlglot/commit/9385433d96765650246d9d851d4f6197e8c958c7) - **optimizer**: stacked decorators bug *(PR [#7784](https://github.com/tobymao/sqlglot/pull/7784) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
105
+ - [`6de030d`](https://github.com/tobymao/sqlglot/commit/6de030d5f39ecc16911fbca9a41ac029e9541d21) - **optimizer**: add timestamp sub-day unit support *(PR [#7785](https://github.com/tobymao/sqlglot/pull/7785) by [@fivetran-kwoodbeck](https://github.com/fivetran-kwoodbeck))*
106
+ - [`52fe296`](https://github.com/tobymao/sqlglot/commit/52fe2966081d430ab22d4eaf52f6d9c8cdb21248) - **exasol**: robust LISTAGG support CLAUDE *(PR [#7786](https://github.com/tobymao/sqlglot/pull/7786) by [@gaoflow](https://github.com/gaoflow))*
107
+ - [`e16a179`](https://github.com/tobymao/sqlglot/commit/e16a179a4226e7049e050f5cc86d63ace9c60b40) - **optimizer**: handle non-commutative subtraction in simplify_equality *(PR [#7791](https://github.com/tobymao/sqlglot/pull/7791) by [@code-alexander](https://github.com/code-alexander))*
108
+ - [`91a781b`](https://github.com/tobymao/sqlglot/commit/91a781b9cbe5fb1a3f401464b6ef76aab0715188) - **annotate_types**: coerce bigquery date function arg types [CLAUDE] *(PR [#7790](https://github.com/tobymao/sqlglot/pull/7790) by [@etonlels](https://github.com/etonlels))*
109
+ - [`b1a0070`](https://github.com/tobymao/sqlglot/commit/b1a0070ca9989e76e30ab512f206423d5d6de0bc) - **optimizer**: resolve lateral subquery columns *(PR [#7802](https://github.com/tobymao/sqlglot/pull/7802) by [@georgesittas](https://github.com/georgesittas))*
110
+ - :arrow_lower_right: *fixes issue [#7799](https://github.com/tobymao/sqlglot/issues/7799) opened by [@EhabEasee](https://github.com/EhabEasee)*
111
+ - [`64e268a`](https://github.com/tobymao/sqlglot/commit/64e268a5d95cd84a87ad74ef569fc9bf356fd3fb) - **clickhouse**: support arrayMap and arrayFilter roundtrips [CODEX] *(PR [#7794](https://github.com/tobymao/sqlglot/pull/7794) by [@gaoflow](https://github.com/gaoflow))*
112
+
113
+ ### :wrench: Chores
114
+ - [`6f4a990`](https://github.com/tobymao/sqlglot/commit/6f4a990356a49f27d4b056ed9a86d69a22206ab4) - **parser**: PARSE_DATETIME uses year as default *(PR [#7743](https://github.com/tobymao/sqlglot/pull/7743) by [@geooo109](https://github.com/geooo109))*
115
+ - [`62a0ba5`](https://github.com/tobymao/sqlglot/commit/62a0ba5bec243be6f1988261a0835cff60c4acfe) - **duckdb**: Add transpilation tests for ilike-replace *(PR [#7744](https://github.com/tobymao/sqlglot/pull/7744) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
116
+ - [`6f99d4e`](https://github.com/tobymao/sqlglot/commit/6f99d4e06d09e576f32f4243caabcbcb44c33a38) - fix makefile to install integration tests *(commit by [@tobymao](https://github.com/tobymao))*
117
+ - [`07fe98b`](https://github.com/tobymao/sqlglot/commit/07fe98bc446b4acde121ae88260294e89e469583) - LISTAGG refactor for exasol *(commit by [@geooo109](https://github.com/geooo109))*
118
+
119
+
120
+ ## [v30.11.0] - 2026-06-11
121
+ ### :boom: BREAKING CHANGES
122
+ - due to [`df507aa`](https://github.com/tobymao/sqlglot/commit/df507aac2887d79e229cbc6003ed206e8528449c) - GET_JSON_OBJECT roundtrip *(PR [#7728](https://github.com/tobymao/sqlglot/pull/7728) by [@geooo109](https://github.com/geooo109))*:
123
+
124
+ GET_JSON_OBJECT roundtrip (#7728)
125
+
126
+ - due to [`333e3c7`](https://github.com/tobymao/sqlglot/commit/333e3c7fa82201c0f87160c7e956e6ee18bd14da) - ConcatWs args set incorrectly in `simplify_concat` *(commit by [@georgesittas](https://github.com/georgesittas))*:
127
+
128
+ ConcatWs args set incorrectly in `simplify_concat`
129
+
130
+
131
+ ### :sparkles: New Features
132
+ - [`74bef2f`](https://github.com/tobymao/sqlglot/commit/74bef2f4617f2fa25881dded12ae3851a7ddfa1f) - **lineage**: add support for `UNPIVOT` *(PR [#7729](https://github.com/tobymao/sqlglot/pull/7729) by [@georgesittas](https://github.com/georgesittas))*
133
+ - :arrow_lower_right: *addresses issue [#7727](https://github.com/tobymao/sqlglot/issues/7727) opened by [@tomoki-takahashi-oisix](https://github.com/tomoki-takahashi-oisix)*
134
+ - [`f3ba8e4`](https://github.com/tobymao/sqlglot/commit/f3ba8e4d20311c4e657f4f763c3e354fa533ba47) - **lineage**: more `UNPIVOT` lineage improvements *(PR [#7736](https://github.com/tobymao/sqlglot/pull/7736) by [@georgesittas](https://github.com/georgesittas))*
135
+
136
+ ### :bug: Bug Fixes
137
+ - [`6ae4b49`](https://github.com/tobymao/sqlglot/commit/6ae4b49f1d2ef0c4f30575a29a0d1b3273520abf) - **tsql**: do not bubble up CTEs in TVF DDLs with inline `RETURN` queries closes [#7721](https://github.com/tobymao/sqlglot/pull/7721) *(commit by [@georgesittas](https://github.com/georgesittas))*
138
+ - [`df507aa`](https://github.com/tobymao/sqlglot/commit/df507aac2887d79e229cbc6003ed206e8528449c) - **databricks**: GET_JSON_OBJECT roundtrip *(PR [#7728](https://github.com/tobymao/sqlglot/pull/7728) by [@geooo109](https://github.com/geooo109))*
139
+ - [`1955881`](https://github.com/tobymao/sqlglot/commit/19558813d3f51e39a20f4e5b669408d72af4e5d6) - **sqlglotc**: pin sqlglot to the exact matching version *(PR [#7730](https://github.com/tobymao/sqlglot/pull/7730) by [@georgesittas](https://github.com/georgesittas))*
140
+ - [`2284484`](https://github.com/tobymao/sqlglot/commit/22844841f1de93643f17ae51077ceac79b0ec69a) - **optimizer**: infinite recursion in the resolver *(PR [#7737](https://github.com/tobymao/sqlglot/pull/7737) by [@georgesittas](https://github.com/georgesittas))*
141
+ - :arrow_lower_right: *fixes issue [#7732](https://github.com/tobymao/sqlglot/issues/7732) opened by [@treff7es](https://github.com/treff7es)*
142
+ - [`333e3c7`](https://github.com/tobymao/sqlglot/commit/333e3c7fa82201c0f87160c7e956e6ee18bd14da) - **optimizer**: ConcatWs args set incorrectly in `simplify_concat` *(commit by [@georgesittas](https://github.com/georgesittas))*
143
+
144
+ ### :zap: Performance Improvements
145
+ - [`9e4b3d1`](https://github.com/tobymao/sqlglot/commit/9e4b3d15e67bf3508c9b25c0c025da0ea3d1a87b) - **optimizer**: speed up qualify by ~24% and optimize by ~17% *(PR [#7724](https://github.com/tobymao/sqlglot/pull/7724) by [@tobymao](https://github.com/tobymao))*
146
+ - [`32ed149`](https://github.com/tobymao/sqlglot/commit/32ed149002aa76a1b0b674b2c27af39daf70fdf5) - **optimizer**: skip redundant hash invalidation in simplify's pointer-reset loop *(PR [#7725](https://github.com/tobymao/sqlglot/pull/7725) by [@tobymao](https://github.com/tobymao))*
147
+
148
+
4
149
  ## [v30.10.0] - 2026-06-09
5
150
  ### :boom: BREAKING CHANGES
6
151
  - due to [`287df74`](https://github.com/tobymao/sqlglot/commit/287df744e968e0b3cd70679abf443ce8db685313) - parsing and generation of `CLUSTER BY` *(PR [#7716](https://github.com/tobymao/sqlglot/pull/7716) by [@JoshuaM176](https://github.com/JoshuaM176))*:
@@ -14609,3 +14754,5 @@ pip install "sqlglot[c]" # compiled — faster, but no subclassing
14609
14754
  [v30.8.0]: https://github.com/tobymao/sqlglot/compare/v30.7.0...v30.8.0
14610
14755
  [v30.9.0]: https://github.com/tobymao/sqlglot/compare/v30.8.0...v30.9.0
14611
14756
  [v30.10.0]: https://github.com/tobymao/sqlglot/compare/v30.9.0...v30.10.0
14757
+ [v30.11.0]: https://github.com/tobymao/sqlglot/compare/v30.10.0...v30.11.0
14758
+ [v30.12.0]: https://github.com/tobymao/sqlglot/compare/v30.11.0...v30.12.0
@@ -45,6 +45,32 @@ Note: make sure to follow the [Conventional Commits](https://www.conventionalcom
45
45
 
46
46
  Each pull request should focus on a single, well-defined change. Avoid bundling multiple unrelated fixes or features in one PR. This makes code review faster and more effective, increases the likelihood of acceptance, and helps maintain a clean git history.
47
47
 
48
+ ## LLM-assisted contributions
49
+
50
+ Like many open source projects, SQLGlot has recently seen a surge of pull requests that are largely
51
+ generated by LLMs (ChatGPT, Claude, Cursor, Copilot, etc.) with little human review. These tools can
52
+ be useful, but low-effort, AI-generated PRs can create problems for the project:
53
+
54
+ - Descriptions are often padded with boilerplate AI slop that obscures what actually changed and why.
55
+ - The code frequently misses subtle nuances and edge cases that the author never took the time to understand.
56
+ - Reviewing them carefully consumes a disproportionate amount of maintainer time, often more than it
57
+ would take a maintainer to implement the change correctly from scratch.
58
+
59
+ Our policy:
60
+
61
+ - **You are fully responsible for every line you submit.** "An LLM wrote it" is not an acceptable answer
62
+ to a review question. If you cannot explain why a change is correct, do not open the PR.
63
+ - **Disclose LLM use.** Human contributors who used an LLM are encouraged to mention it in a disclaimer.
64
+ - **Write the PR description yourself.** Keep it concise and human-written; a few clear sentences without
65
+ emojis summaries and restatements of the diff are worth more than a wall of text.
66
+ - **If you are a new contributor, prefer opening an issue over a PR.** We are interested in growing
67
+ long-term contributors who genuinely understand the codebase. If you have found a bug or have a fix in
68
+ mind, open a well-written issue with a reproducible example (see below). The core team can usually
69
+ address it faster and more accurately than it takes to review an AI-generated PR.
70
+ - **Low-effort PRs that are mostly LLM-generated with little human input will be closed** without a
71
+ detailed review, with a pointer to this policy. This is not a judgment of you as a contributor, it is
72
+ simply how we keep review bandwidth focused on changes that move the project forward.
73
+
48
74
  ## Report bugs using GitHub's [issues](https://github.com/tobymao/sqlglot/issues)
49
75
 
50
76
  We use GitHub issues to track public bugs. Report a bug by opening a new issue.
@@ -24,8 +24,12 @@ install:
24
24
  $(PIP) install -e .
25
25
 
26
26
  install-dev:
27
- $(PIP) install -e ".[dev]"
28
27
  git submodule update --init 2>/dev/null || true
28
+ @if [ -f sqlglot-integration-tests/Makefile ]; then \
29
+ $(MAKE) -C sqlglot-integration-tests install; \
30
+ fi
31
+ $(PIP) install -e ".[dev]"
32
+ $(PIP) uninstall -y sqlglotc 2>/dev/null || true
29
33
  @if ! command -v gh >/dev/null 2>&1; then \
30
34
  echo ""; \
31
35
  echo "gh (GitHub CLI) is not installed. It is needed to auto-create PRs for integration tests."; \
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 30.11.0
3
+ Version: 30.13.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
@@ -19,7 +19,7 @@ Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
20
  Provides-Extra: dev
21
21
  Requires-Dist: duckdb>=0.6; extra == "dev"
22
- Requires-Dist: sqlglot-mypy>=2.1.0.post2; python_version >= "3.10" and extra == "dev"
22
+ Requires-Dist: sqlglot-mypy>=2.1.0.post9; python_version >= "3.10" and extra == "dev"
23
23
  Requires-Dist: mypy; python_version < "3.10" and extra == "dev"
24
24
  Requires-Dist: setuptools_scm; extra == "dev"
25
25
  Requires-Dist: pandas; extra == "dev"
@@ -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.11.0; python_version >= "3.10" and extra == "c"
37
+ Requires-Dist: sqlglotc==30.13.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.11.0; python_version >= "3.10" and extra == "rs"
40
+ Requires-Dist: sqlglotc==30.13.0; python_version >= "3.10" and extra == "rs"
41
41
  Dynamic: license-file
42
42
  Dynamic: provides-extra
43
43
 
@@ -629,6 +629,7 @@ x + interval '1' month
629
629
  | BigQuery | Official |
630
630
  | ClickHouse | Official |
631
631
  | Databricks | Official |
632
+ | DAX | Community |
632
633
  | Doris | Community |
633
634
  | Dremio | Community |
634
635
  | Drill | Community |
@@ -586,6 +586,7 @@ x + interval '1' month
586
586
  | BigQuery | Official |
587
587
  | ClickHouse | Official |
588
588
  | Databricks | Official |
589
+ | DAX | Community |
589
590
  | Doris | Community |
590
591
  | Dremio | Community |
591
592
  | Drill | Community |
@@ -9,7 +9,7 @@ setup(
9
9
  "duckdb>=0.6",
10
10
  # sqlglot-mypy 1.20+ is the build dep for sqlglotc and only ships
11
11
  # for py3.10+; on py3.9 just use upstream mypy for type checking.
12
- "sqlglot-mypy >= 2.1.0.post2; python_version >= '3.10'",
12
+ "sqlglot-mypy >= 2.1.0.post9; python_version >= '3.10'",
13
13
  "mypy; python_version < '3.10'",
14
14
  "setuptools_scm",
15
15
  "pandas",
@@ -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.11.0'
22
- __version_tuple__ = version_tuple = (30, 11, 0)
21
+ __version__ = version = '30.13.0'
22
+ __version_tuple__ = version_tuple = (30, 13, 0)
23
23
 
24
- __commit_id__ = commit_id = 'g333e3c7fa'
24
+ __commit_id__ = commit_id = 'g98e2b3fa9'
@@ -69,6 +69,7 @@ DIALECTS = [
69
69
  "BigQuery",
70
70
  "ClickHouse",
71
71
  "Databricks",
72
+ "DAX",
72
73
  "Doris",
73
74
  "Dremio",
74
75
  "Drill",
@@ -108,6 +108,7 @@ class ClickHouse(Dialect):
108
108
  "IPV4": TokenType.IPV4,
109
109
  "IPV6": TokenType.IPV6,
110
110
  "POINT": TokenType.POINT,
111
+ "PROJECTION": TokenType.PROJECTION,
111
112
  "RING": TokenType.RING,
112
113
  "LINESTRING": TokenType.LINESTRING,
113
114
  "MULTILINESTRING": TokenType.MULTILINESTRING,
@@ -9,11 +9,13 @@ from sqlglot.generators.databricks import DatabricksGenerator
9
9
  from sqlglot.parsers.databricks import DatabricksParser
10
10
  from sqlglot.tokens import TokenType
11
11
  from sqlglot.optimizer.annotate_types import TypeAnnotator
12
+ from sqlglot.typing.databricks import EXPRESSION_METADATA
12
13
 
13
14
 
14
15
  class Databricks(Spark):
15
16
  SAFE_DIVISION = False
16
17
  COPY_PARAMS_ARE_CSV = False
18
+ EXPRESSION_METADATA = EXPRESSION_METADATA.copy()
17
19
 
18
20
  COERCES_TO = defaultdict(set, deepcopy(TypeAnnotator.COERCES_TO))
19
21
  for text_type in exp.DataType.TEXT_TYPES:
@@ -0,0 +1,20 @@
1
+ from __future__ import annotations
2
+
3
+ from sqlglot import tokens
4
+ from sqlglot.dialects.dialect import Dialect
5
+ from sqlglot.generators.dax import DAXGenerator
6
+ from sqlglot.parsers.dax import DAXParser
7
+
8
+
9
+ class DAX(Dialect):
10
+ DPIPE_IS_STRING_CONCAT = False
11
+
12
+ Generator = DAXGenerator
13
+
14
+ class Tokenizer(tokens.Tokenizer):
15
+ IDENTIFIERS = ["'", ("[", "]")]
16
+ QUOTES = ['"']
17
+ STRING_ESCAPES = ['"']
18
+ COMMENTS = ["--", "//", ("/*", "*/")]
19
+
20
+ Parser = DAXParser
@@ -86,6 +86,7 @@ class Dialects(str, Enum):
86
86
  BIGQUERY = "bigquery"
87
87
  CLICKHOUSE = "clickhouse"
88
88
  DATABRICKS = "databricks"
89
+ DAX = "dax"
89
90
  DORIS = "doris"
90
91
  DREMIO = "dremio"
91
92
  DRILL = "drill"
@@ -134,6 +135,23 @@ class NormalizationStrategy(str, AutoName):
134
135
  """Always case-insensitive (uppercase), regardless of quotes."""
135
136
 
136
137
 
138
+ # "Strict" dialects (e.g. modern Hive, Spark 3+) map their zero-padded MM/dd to these in TIME_MAPPING so they
139
+ # roundtrip, since a lax %m/%d renders non-padded there for parse expressions (see HiveGenerator.format_time).
140
+ STRICT_TIME_FORMATS = {"%mstrict": "%m", "%dstrict": "%d"}
141
+
142
+
143
+ def _with_strict_time_inverse(inverse_mapping: dict[str, str]) -> dict[str, str]:
144
+ for strict_format, lax_format in STRICT_TIME_FORMATS.items():
145
+ if strict_format in inverse_mapping:
146
+ # In strict dialects, a foreign lax %m formats the same padded way as %mstrict (MM)
147
+ inverse_mapping.setdefault(lax_format, inverse_mapping[strict_format])
148
+ else:
149
+ # Elsewhere, the strict format degrades to its lax counterpart so it never leaks
150
+ inverse_mapping.setdefault(strict_format, inverse_mapping.get(lax_format, lax_format))
151
+
152
+ return inverse_mapping
153
+
154
+
137
155
  class _Dialect(type):
138
156
  _classes: dict[str, Type[Dialect]] = {}
139
157
 
@@ -237,11 +255,14 @@ class _Dialect(type):
237
255
  )
238
256
  # Merge class-defined INVERSE_TIME_MAPPING with auto-generated mappings
239
257
  # This allows dialects to define custom inverse mappings for roundtrip correctness
240
- klass.INVERSE_TIME_MAPPING = {v: k for k, v in klass.TIME_MAPPING.items()} | (
241
- klass.__dict__.get("INVERSE_TIME_MAPPING") or {}
258
+ klass.INVERSE_TIME_MAPPING = _with_strict_time_inverse(
259
+ {v: k for k, v in klass.TIME_MAPPING.items()}
260
+ | (klass.__dict__.get("INVERSE_TIME_MAPPING") or {})
242
261
  )
243
262
  klass.INVERSE_TIME_TRIE = new_trie(klass.INVERSE_TIME_MAPPING)
244
- klass.INVERSE_FORMAT_MAPPING = {v: k for k, v in klass.FORMAT_MAPPING.items()}
263
+ klass.INVERSE_FORMAT_MAPPING = _with_strict_time_inverse(
264
+ {v: k for k, v in klass.FORMAT_MAPPING.items()}
265
+ )
245
266
  klass.INVERSE_FORMAT_TRIE = new_trie(klass.INVERSE_FORMAT_MAPPING)
246
267
 
247
268
  klass.INVERSE_CREATABLE_KIND_MAPPING = {
@@ -305,7 +326,12 @@ class _Dialect(type):
305
326
  **klass.UNESCAPED_SEQUENCES,
306
327
  }
307
328
 
308
- klass.ESCAPED_SEQUENCES = {v: k for k, v in klass.UNESCAPED_SEQUENCES.items()}
329
+ klass.ESCAPED_SEQUENCES = {
330
+ # The filter is necessary because of `\\a -> a` in Snowflake; we can't replace `a` with `\a`.
331
+ v: k
332
+ for k, v in klass.UNESCAPED_SEQUENCES.items()
333
+ if not v.isprintable() or v == "\\"
334
+ }
309
335
 
310
336
  klass.SUPPORTS_COLUMN_JOIN_MARKS = "(+)" in klass.tokenizer_class.KEYWORDS
311
337
 
@@ -1792,10 +1818,6 @@ def trim_sql(self: Generator, expression: exp.Trim, default_trim_type: str = "")
1792
1818
  return f"TRIM({trim_type}{remove_chars}{from_part}{target}{collation})"
1793
1819
 
1794
1820
 
1795
- def str_to_time_sql(self: Generator, expression: exp.Expr) -> str:
1796
- return self.func("STRPTIME", expression.this, self.format_time(expression))
1797
-
1798
-
1799
1821
  def concat_to_dpipe_sql(self: Generator, expression: exp.Concat) -> str:
1800
1822
  return self.sql(reduce(lambda x, y: exp.DPipe(this=x, expression=y), expression.expressions))
1801
1823
 
@@ -2019,6 +2041,45 @@ def unit_to_var(expression: exp.Expr, default: str = "DAY") -> exp.Expr | None:
2019
2041
  return exp.Var(this=value) if value else None
2020
2042
 
2021
2043
 
2044
+ # Days of week to ISO 8601 day-of-week numbers
2045
+ # ISO 8601 standard: Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7
2046
+ WEEK_START_DAY_TO_DOW = {
2047
+ "MONDAY": 1,
2048
+ "TUESDAY": 2,
2049
+ "WEDNESDAY": 3,
2050
+ "THURSDAY": 4,
2051
+ "FRIDAY": 5,
2052
+ "SATURDAY": 6,
2053
+ "SUNDAY": 7,
2054
+ }
2055
+
2056
+
2057
+ def week_unit_to_dow(unit: exp.Expr | None) -> int | None:
2058
+ """
2059
+ Compute the week start day for a week-ish diff unit, e.g BigQuery's WEEK(<day>)
2060
+ or ISOWEEK unit parts.
2061
+
2062
+ Args:
2063
+ unit: The unit expression (Var for WEEK/ISOWEEK or WeekStart)
2064
+
2065
+ Returns:
2066
+ The ISO 8601 day number (Monday=1, Sunday=7 etc) or None if not a week unit or if day is dynamic (not a constant).
2067
+
2068
+ Examples:
2069
+ "WEEK(SUNDAY)" -> 7
2070
+ "WEEK(MONDAY)" -> 1
2071
+ "ISOWEEK" -> 1
2072
+ """
2073
+ if isinstance(unit, exp.Var) and unit.name.upper() in ("WEEK", "ISOWEEK"):
2074
+ return 1
2075
+
2076
+ # Handle WeekStart expressions with explicit day
2077
+ if isinstance(unit, exp.WeekStart):
2078
+ return WEEK_START_DAY_TO_DOW.get(unit.name.upper())
2079
+
2080
+ return None
2081
+
2082
+
2022
2083
  @t.overload
2023
2084
  def map_date_part(part: exp.Expr, dialect: DialectType = Dialect) -> exp.Expr:
2024
2085
  pass
@@ -2134,10 +2195,9 @@ def json_extract_segments(
2134
2195
  if not isinstance(path, exp.JSONPath):
2135
2196
  return rename_func(name)(self, expression)
2136
2197
 
2137
- escape = path.args.get("escape")
2138
-
2139
2198
  segments = []
2140
2199
  for segment in path.expressions:
2200
+ escape = segment.args.get("quoted")
2141
2201
  path = self.sql(segment)
2142
2202
  if path:
2143
2203
  if isinstance(segment, exp.JSONPathPart) and (
@@ -67,6 +67,12 @@ class Dremio(Dialect):
67
67
  class Tokenizer(tokens.Tokenizer):
68
68
  COMMENTS = ["--", "//", ("/*", "*/")]
69
69
 
70
+ KEYWORDS = {
71
+ **tokens.Tokenizer.KEYWORDS,
72
+ "AT SNAPSHOT": tokens.TokenType.VERSION_SNAPSHOT,
73
+ "AT TIMESTAMP": tokens.TokenType.TIMESTAMP_SNAPSHOT,
74
+ }
75
+
70
76
  Parser = DremioParser
71
77
 
72
78
  Generator = DremioGenerator
@@ -52,9 +52,10 @@ class Hive(Dialect):
52
52
  "yy": "%y",
53
53
  "MMMM": "%B",
54
54
  "MMM": "%b",
55
- "MM": "%m",
55
+ # Hive 4.0+ parses MM/dd strictly (java.time.DateTimeFormatter, see HIVE-25458/HIVE-25576)
56
+ "MM": "%mstrict",
56
57
  "M": "%-m",
57
- "dd": "%d",
58
+ "dd": "%dstrict",
58
59
  "d": "%-d",
59
60
  "HH": "%H",
60
61
  "H": "%-H",
@@ -51,12 +51,16 @@ class Postgres(Dialect):
51
51
  "TMDy": "%a",
52
52
  "TMMon": "%b", # Sep
53
53
  "TMMonth": "%B", # September
54
+ "day": "%Aenlower", # tuesday
55
+ "dy": "%aenlower", # tue
54
56
  "TZ": "%Z", # uppercase timezone name
55
57
  "US": "%f", # zero padded microsecond
56
58
  "ww": "%U", # 1-based week of year
57
59
  "WW": "%U", # 1-based week of year
58
60
  "yy": "%y", # 15
59
61
  "YY": "%y", # 15
62
+ "yyy": "%Ythree", # 015
63
+ "YYY": "%Ythree", # 015
60
64
  "yyyy": "%Y", # 2015
61
65
  "YYYY": "%Y", # 2015
62
66
  }
@@ -65,6 +69,7 @@ class Postgres(Dialect):
65
69
  BIT_STRINGS = [("b'", "'"), ("B'", "'")]
66
70
  HEX_STRINGS = [("x'", "'"), ("X'", "'")]
67
71
  BYTE_STRINGS = [("e'", "'"), ("E'", "'")]
72
+ UNICODE_STRINGS = [("U&'", "'"), ("u&'", "'")]
68
73
  BYTE_STRING_ESCAPES = ["'", "\\"]
69
74
  HEREDOC_STRINGS = ["$"]
70
75
 
@@ -75,6 +80,7 @@ class Postgres(Dialect):
75
80
  **tokens.Tokenizer.KEYWORDS,
76
81
  "~": TokenType.RLIKE,
77
82
  "@@": TokenType.DAT,
83
+ "@?": TokenType.AT_QMARK,
78
84
  "@>": TokenType.AT_GT,
79
85
  "<@": TokenType.LT_AT,
80
86
  "?&": TokenType.QMARK_AMP,
@@ -16,6 +16,8 @@ from sqlglot.typing.snowflake import EXPRESSION_METADATA
16
16
  class Snowflake(Dialect):
17
17
  # https://docs.snowflake.com/en/sql-reference/identifiers-syntax
18
18
  NORMALIZATION_STRATEGY = NormalizationStrategy.UPPERCASE
19
+ # https://docs.snowflake.com/en/sql-reference/data-types-text#escape-sequences
20
+ UNESCAPED_SEQUENCES = {"\\a": "a", "\\v": "v"}
19
21
  NULL_ORDERING = "nulls_are_large"
20
22
  TIME_FORMAT = "'YYYY-MM-DD HH24:MI:SS'"
21
23
  SUPPORTS_USER_DEFINED_TYPES = False
@@ -152,6 +154,7 @@ class Snowflake(Dialect):
152
154
  "POLICY": TokenType.POLICY,
153
155
  "POOL": TokenType.POOL,
154
156
  "PUT": TokenType.PUT,
157
+ "UNDROP": TokenType.UNDROP,
155
158
  "REMOVE": TokenType.COMMAND,
156
159
  "RM": TokenType.COMMAND,
157
160
  "ROLE": TokenType.ROLE,
@@ -16,6 +16,9 @@ class Spark(Spark2):
16
16
  ARRAY_FUNCS_PROPAGATES_NULLS = True
17
17
  EXPRESSION_METADATA = EXPRESSION_METADATA.copy()
18
18
 
19
+ # Spark 3+ parses MM/dd strictly, unlike Spark 2 (SimpleDateFormat)
20
+ TIME_MAPPING = {**Spark2.TIME_MAPPING, "MM": "%mstrict", "dd": "%dstrict"}
21
+
19
22
  class Tokenizer(Spark2.Tokenizer):
20
23
  STRING_ESCAPES_ALLOWED_IN_RAW_STRINGS = False
21
24
 
@@ -12,6 +12,9 @@ class Spark2(Hive):
12
12
 
13
13
  EXPRESSION_METADATA = EXPRESSION_METADATA.copy()
14
14
 
15
+ # Spark 2.x parses MM/dd leniently (SimpleDateFormat), unlike strict Hive/Spark 3+
16
+ TIME_MAPPING = {**Hive.TIME_MAPPING, "MM": "%m", "dd": "%d"}
17
+
15
18
  # https://spark.apache.org/docs/latest/api/sql/index.html#initcap
16
19
  # https://docs.databricks.com/aws/en/sql/language-manual/functions/initcap
17
20
  # https://github.com/apache/spark/blob/master/common/unsafe/src/main/java/org/apache/spark/unsafe/types/UTF8String.java#L859-L905
@@ -102,6 +102,7 @@ class Count(Expression, AggFunc):
102
102
 
103
103
  class CountIf(Expression, AggFunc):
104
104
  _sql_names = ["COUNT_IF", "COUNTIF"]
105
+ arg_types = {"this": True, "zero_on_all_null": False}
105
106
 
106
107
 
107
108
  class CovarPop(Expression, AggFunc):
@@ -255,19 +256,19 @@ class RegrAvgy(Expression, AggFunc):
255
256
 
256
257
 
257
258
  class RegrCount(Expression, AggFunc):
258
- arg_types = {"this": True, "expression": True}
259
+ arg_types = {"this": True, "expression": False}
259
260
 
260
261
 
261
262
  class RegrIntercept(Expression, AggFunc):
262
- arg_types = {"this": True, "expression": True}
263
+ arg_types = {"this": True, "expression": False}
263
264
 
264
265
 
265
266
  class RegrR2(Expression, AggFunc):
266
- arg_types = {"this": True, "expression": True}
267
+ arg_types = {"this": True, "expression": False}
267
268
 
268
269
 
269
270
  class RegrSlope(Expression, AggFunc):
270
- arg_types = {"this": True, "expression": True}
271
+ arg_types = {"this": True, "expression": False}
271
272
 
272
273
 
273
274
  class RegrSxx(Expression, AggFunc):
@@ -114,6 +114,10 @@ class ArrayContainsAll(Expression, Binary, Func):
114
114
  _sql_names = ["ARRAY_CONTAINS_ALL", "ARRAY_HAS_ALL"]
115
115
 
116
116
 
117
+ class ArrayContainedBy(Expression, Binary, Func):
118
+ pass
119
+
120
+
117
121
  class ArrayExcept(Expression, Func):
118
122
  arg_types = {"this": True, "expression": True, "is_multiset": False}
119
123