sqlglot 30.3.0__tar.gz → 30.4.2__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 (321) hide show
  1. {sqlglot-30.3.0 → sqlglot-30.4.2}/CHANGELOG.md +60 -0
  2. {sqlglot-30.3.0/sqlglot.egg-info → sqlglot-30.4.2}/PKG-INFO +3 -3
  3. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/_version.py +3 -3
  4. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generator.py +11 -0
  5. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/duckdb.py +49 -0
  6. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/snowflake.py +1 -0
  7. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parser.py +5 -1
  8. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/schema.py +2 -8
  9. {sqlglot-30.3.0 → sqlglot-30.4.2/sqlglot.egg-info}/PKG-INFO +3 -3
  10. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot.egg-info/requires.txt +2 -2
  11. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_dialect.py +2 -2
  12. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_snowflake.py +4 -0
  13. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_tsql.py +1 -0
  14. {sqlglot-30.3.0 → sqlglot-30.4.2}/.gitignore +0 -0
  15. {sqlglot-30.3.0 → sqlglot-30.4.2}/.gitmodules +0 -0
  16. {sqlglot-30.3.0 → sqlglot-30.4.2}/.gitpod.yml +0 -0
  17. {sqlglot-30.3.0 → sqlglot-30.4.2}/.pre-commit-config.yaml +0 -0
  18. {sqlglot-30.3.0 → sqlglot-30.4.2}/AGENTS.md +0 -0
  19. {sqlglot-30.3.0 → sqlglot-30.4.2}/CLAUDE.md +0 -0
  20. {sqlglot-30.3.0 → sqlglot-30.4.2}/CONTRIBUTING.md +0 -0
  21. {sqlglot-30.3.0 → sqlglot-30.4.2}/LICENSE +0 -0
  22. {sqlglot-30.3.0 → sqlglot-30.4.2}/MANIFEST.in +0 -0
  23. {sqlglot-30.3.0 → sqlglot-30.4.2}/Makefile +0 -0
  24. {sqlglot-30.3.0 → sqlglot-30.4.2}/README.md +0 -0
  25. {sqlglot-30.3.0 → sqlglot-30.4.2}/pyproject.toml +0 -0
  26. {sqlglot-30.3.0 → sqlglot-30.4.2}/setup.cfg +0 -0
  27. {sqlglot-30.3.0 → sqlglot-30.4.2}/setup.py +0 -0
  28. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/__init__.py +0 -0
  29. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/__main__.py +0 -0
  30. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/_typing.py +0 -0
  31. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/__init__.py +0 -0
  32. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/athena.py +0 -0
  33. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/bigquery.py +0 -0
  34. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/clickhouse.py +0 -0
  35. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/databricks.py +0 -0
  36. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/dialect.py +0 -0
  37. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/doris.py +0 -0
  38. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/dremio.py +0 -0
  39. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/drill.py +0 -0
  40. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/druid.py +0 -0
  41. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/duckdb.py +0 -0
  42. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/dune.py +0 -0
  43. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/exasol.py +0 -0
  44. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/fabric.py +0 -0
  45. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/hive.py +0 -0
  46. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/materialize.py +0 -0
  47. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/mysql.py +0 -0
  48. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/oracle.py +0 -0
  49. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/postgres.py +0 -0
  50. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/presto.py +0 -0
  51. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/prql.py +0 -0
  52. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/redshift.py +0 -0
  53. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/risingwave.py +0 -0
  54. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/singlestore.py +0 -0
  55. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/snowflake.py +0 -0
  56. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/solr.py +0 -0
  57. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/spark.py +0 -0
  58. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/spark2.py +0 -0
  59. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/sqlite.py +0 -0
  60. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/starrocks.py +0 -0
  61. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/tableau.py +0 -0
  62. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/teradata.py +0 -0
  63. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/trino.py +0 -0
  64. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/dialects/tsql.py +0 -0
  65. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/diff.py +0 -0
  66. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/errors.py +0 -0
  67. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/executor/__init__.py +0 -0
  68. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/executor/context.py +0 -0
  69. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/executor/env.py +0 -0
  70. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/executor/python.py +0 -0
  71. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/executor/table.py +0 -0
  72. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/__init__.py +0 -0
  73. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/aggregate.py +0 -0
  74. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/array.py +0 -0
  75. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/builders.py +0 -0
  76. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/constraints.py +0 -0
  77. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/core.py +0 -0
  78. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/datatypes.py +0 -0
  79. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/ddl.py +0 -0
  80. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/dml.py +0 -0
  81. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/functions.py +0 -0
  82. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/json.py +0 -0
  83. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/math.py +0 -0
  84. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/properties.py +0 -0
  85. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/query.py +0 -0
  86. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/string.py +0 -0
  87. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/expressions/temporal.py +0 -0
  88. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/__init__.py +0 -0
  89. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/athena.py +0 -0
  90. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/bigquery.py +0 -0
  91. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/clickhouse.py +0 -0
  92. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/databricks.py +0 -0
  93. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/doris.py +0 -0
  94. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/dremio.py +0 -0
  95. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/drill.py +0 -0
  96. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/druid.py +0 -0
  97. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/dune.py +0 -0
  98. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/exasol.py +0 -0
  99. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/fabric.py +0 -0
  100. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/hive.py +0 -0
  101. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/materialize.py +0 -0
  102. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/mysql.py +0 -0
  103. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/oracle.py +0 -0
  104. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/postgres.py +0 -0
  105. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/presto.py +0 -0
  106. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/prql.py +0 -0
  107. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/redshift.py +0 -0
  108. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/risingwave.py +0 -0
  109. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/singlestore.py +0 -0
  110. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/solr.py +0 -0
  111. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/spark.py +0 -0
  112. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/spark2.py +0 -0
  113. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/sqlite.py +0 -0
  114. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/starrocks.py +0 -0
  115. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/tableau.py +0 -0
  116. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/teradata.py +0 -0
  117. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/trino.py +0 -0
  118. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/generators/tsql.py +0 -0
  119. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/helper.py +0 -0
  120. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/jsonpath.py +0 -0
  121. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/lineage.py +0 -0
  122. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/__init__.py +0 -0
  123. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/annotate_types.py +0 -0
  124. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/canonicalize.py +0 -0
  125. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/eliminate_ctes.py +0 -0
  126. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/eliminate_joins.py +0 -0
  127. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
  128. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  129. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/merge_subqueries.py +0 -0
  130. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/normalize.py +0 -0
  131. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  132. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/optimize_joins.py +0 -0
  133. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/optimizer.py +0 -0
  134. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/pushdown_predicates.py +0 -0
  135. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/pushdown_projections.py +0 -0
  136. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/qualify.py +0 -0
  137. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/qualify_columns.py +0 -0
  138. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/qualify_tables.py +0 -0
  139. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/resolver.py +0 -0
  140. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/scope.py +0 -0
  141. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/simplify.py +0 -0
  142. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/optimizer/unnest_subqueries.py +0 -0
  143. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/__init__.py +0 -0
  144. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/athena.py +0 -0
  145. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/base.py +0 -0
  146. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/bigquery.py +0 -0
  147. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/clickhouse.py +0 -0
  148. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/databricks.py +0 -0
  149. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/doris.py +0 -0
  150. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/dremio.py +0 -0
  151. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/drill.py +0 -0
  152. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/druid.py +0 -0
  153. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/duckdb.py +0 -0
  154. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/dune.py +0 -0
  155. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/exasol.py +0 -0
  156. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/fabric.py +0 -0
  157. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/hive.py +0 -0
  158. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/materialize.py +0 -0
  159. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/mysql.py +0 -0
  160. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/oracle.py +0 -0
  161. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/postgres.py +0 -0
  162. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/presto.py +0 -0
  163. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/prql.py +0 -0
  164. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/redshift.py +0 -0
  165. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/risingwave.py +0 -0
  166. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/singlestore.py +0 -0
  167. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/snowflake.py +0 -0
  168. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/solr.py +0 -0
  169. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/spark.py +0 -0
  170. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/spark2.py +0 -0
  171. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/sqlite.py +0 -0
  172. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/starrocks.py +0 -0
  173. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/tableau.py +0 -0
  174. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/teradata.py +0 -0
  175. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/trino.py +0 -0
  176. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/parsers/tsql.py +0 -0
  177. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/planner.py +0 -0
  178. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/py.typed +0 -0
  179. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/serde.py +0 -0
  180. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/time.py +0 -0
  181. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/tokenizer_core.py +0 -0
  182. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/tokens.py +0 -0
  183. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/transforms.py +0 -0
  184. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/trie.py +0 -0
  185. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/__init__.py +0 -0
  186. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/bigquery.py +0 -0
  187. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/clickhouse.py +0 -0
  188. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/duckdb.py +0 -0
  189. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/hive.py +0 -0
  190. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/mysql.py +0 -0
  191. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/presto.py +0 -0
  192. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/redshift.py +0 -0
  193. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/snowflake.py +0 -0
  194. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/spark.py +0 -0
  195. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/spark2.py +0 -0
  196. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot/typing/tsql.py +0 -0
  197. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot.egg-info/SOURCES.txt +0 -0
  198. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot.egg-info/dependency_links.txt +0 -0
  199. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot.egg-info/top_level.txt +0 -0
  200. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglot.png +0 -0
  201. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglotc/MANIFEST.in +0 -0
  202. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglotc/pyproject.toml +0 -0
  203. {sqlglot-30.3.0 → sqlglot-30.4.2}/sqlglotc/setup.py +0 -0
  204. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/__init__.py +0 -0
  205. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/__init__.py +0 -0
  206. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_athena.py +0 -0
  207. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_bigquery.py +0 -0
  208. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_clickhouse.py +0 -0
  209. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_databricks.py +0 -0
  210. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_doris.py +0 -0
  211. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_dremio.py +0 -0
  212. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_drill.py +0 -0
  213. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_druid.py +0 -0
  214. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_duckdb.py +0 -0
  215. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_dune.py +0 -0
  216. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_exasol.py +0 -0
  217. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_fabric.py +0 -0
  218. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_hive.py +0 -0
  219. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_materialize.py +0 -0
  220. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_mysql.py +0 -0
  221. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_oracle.py +0 -0
  222. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_pipe_syntax.py +0 -0
  223. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_postgres.py +0 -0
  224. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_presto.py +0 -0
  225. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_prql.py +0 -0
  226. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_redshift.py +0 -0
  227. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_risingwave.py +0 -0
  228. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_singlestore.py +0 -0
  229. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_solr.py +0 -0
  230. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_spark.py +0 -0
  231. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_sqlite.py +0 -0
  232. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_starrocks.py +0 -0
  233. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_tableau.py +0 -0
  234. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_teradata.py +0 -0
  235. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/dialects/test_trino.py +0 -0
  236. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/identity.sql +0 -0
  237. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/jsonpath/LICENSE +0 -0
  238. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/jsonpath/cts.json +0 -0
  239. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/annotate_functions.sql +0 -0
  240. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/annotate_types.sql +0 -0
  241. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/canonicalize.sql +0 -0
  242. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
  243. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
  244. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
  245. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
  246. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
  247. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/normalize.sql +0 -0
  248. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
  249. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
  250. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/optimizer.sql +0 -0
  251. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
  252. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
  253. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
  254. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/qualify_columns.sql +0 -0
  255. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
  256. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
  257. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
  258. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
  259. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
  260. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/simplify.sql +0 -0
  261. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
  262. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
  263. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
  264. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
  265. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
  266. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
  267. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
  268. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
  269. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
  270. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
  271. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
  272. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
  273. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
  274. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
  275. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
  276. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
  277. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
  278. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
  279. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
  280. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
  281. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
  282. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
  283. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
  284. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
  285. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
  286. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
  287. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
  288. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
  289. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
  290. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
  291. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
  292. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
  293. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
  294. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
  295. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
  296. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/partial.sql +0 -0
  297. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/fixtures/pretty.sql +0 -0
  298. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/gen_fixtures.py +0 -0
  299. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/helpers.py +0 -0
  300. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/sqlglot/__init__.py +0 -0
  301. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_build.py +0 -0
  302. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_dialect_entry_points.py +0 -0
  303. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_dialect_imports.py +0 -0
  304. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_diff.py +0 -0
  305. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_docs.py +0 -0
  306. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_errors.py +0 -0
  307. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_executor.py +0 -0
  308. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_expressions.py +0 -0
  309. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_generator.py +0 -0
  310. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_helper.py +0 -0
  311. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_integration_loader.py +0 -0
  312. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_jsonpath.py +0 -0
  313. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_lineage.py +0 -0
  314. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_optimizer.py +0 -0
  315. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_parser.py +0 -0
  316. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_schema.py +0 -0
  317. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_serde.py +0 -0
  318. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_time.py +0 -0
  319. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_tokens.py +0 -0
  320. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_transforms.py +0 -0
  321. {sqlglot-30.3.0 → sqlglot-30.4.2}/tests/test_transpile.py +0 -0
@@ -1,6 +1,64 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ ## [v30.4.0] - 2026-04-08
5
+ ### :sparkles: New Features
6
+ - [`24ff8bb`](https://github.com/tobymao/sqlglot/commit/24ff8bb6c1d94a03f6611d4353e210108c25a6a6) - **duckdb**: Add transpilation support for COLLATE function *(PR [#7461](https://github.com/tobymao/sqlglot/pull/7461) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
7
+ - [`6717634`](https://github.com/tobymao/sqlglot/commit/67176343b150dd0121c7537e1b828bfde5a7a176) - **snowflake**: transpilation support for CONCAT_WS NULL semantics when transpiling to DuckDB *(PR [#7464](https://github.com/tobymao/sqlglot/pull/7464) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
8
+ - [`00970d8`](https://github.com/tobymao/sqlglot/commit/00970d85aaac2ca40c967c6fd4ad03dbc5f0367d) - **duckdb**: Add transpilation support for RTRIMMED_LENGTH function *(PR [#7468](https://github.com/tobymao/sqlglot/pull/7468) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
9
+
10
+ ### :bug: Bug Fixes
11
+ - [`d3c2eeb`](https://github.com/tobymao/sqlglot/commit/d3c2eeb724c548913352369743ddefb78494417f) - **tsql**: improve `SELECT TOP` parsing *(commit by [@georgesittas](https://github.com/georgesittas))*
12
+ - [`800c0c4`](https://github.com/tobymao/sqlglot/commit/800c0c44bb3a2f209be9118ba71b993a99d63e3a) - **snowflake**: emit proper `HANDLER` property syntax *(commit by [@georgesittas](https://github.com/georgesittas))*
13
+
14
+
15
+ ## [v30.3.0] - 2026-04-07
16
+ ### :boom: BREAKING CHANGES
17
+ - due to [`d044414`](https://github.com/tobymao/sqlglot/commit/d0444141c2d5888bddfb8301d5c643f87ab1a054) - support transpilation of function LEFT from Snowflake … *(PR [#7419](https://github.com/tobymao/sqlglot/pull/7419) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*:
18
+
19
+ support transpilation of function LEFT from Snowflake … (#7419)
20
+
21
+ - due to [`61bb18c`](https://github.com/tobymao/sqlglot/commit/61bb18cc00a1749f8945e56ff4e83e4c809bd6df) - Transpilation support for TO_DECIMAL, TO_NUMBER,NUMERIC *(PR [#7315](https://github.com/tobymao/sqlglot/pull/7315) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*:
22
+
23
+ Transpilation support for TO_DECIMAL, TO_NUMBER,NUMERIC (#7315)
24
+
25
+
26
+ ### :sparkles: New Features
27
+ - [`d044414`](https://github.com/tobymao/sqlglot/commit/d0444141c2d5888bddfb8301d5c643f87ab1a054) - **duckdb**: support transpilation of function LEFT from Snowflake … *(PR [#7419](https://github.com/tobymao/sqlglot/pull/7419) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
28
+ - [`11e0dab`](https://github.com/tobymao/sqlglot/commit/11e0dabb47a6d761f3166bd98999f461ac3e7146) - add `Expr.pipe` and `Expr.apply` methods *(PR [#7442](https://github.com/tobymao/sqlglot/pull/7442) by [@OutSquareCapital](https://github.com/OutSquareCapital))*
29
+ - [`21f4ecc`](https://github.com/tobymao/sqlglot/commit/21f4ecc7f319ad50cdfb59f7fd7cc29eebc58d42) - **duckdb**: transpilation support for position with binary arguments *(PR [#7433](https://github.com/tobymao/sqlglot/pull/7433) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
30
+ - [`d57221a`](https://github.com/tobymao/sqlglot/commit/d57221a7d3ee75772d45d6c03acd8e511b4eda09) - **hive**: add native AST support for USING JAR/FILE/ARCHIVE in CREATE FUNCTION *(PR [#7436](https://github.com/tobymao/sqlglot/pull/7436) by [@hashwnath](https://github.com/hashwnath))*
31
+ - :arrow_lower_right: *addresses issue [#7435](https://github.com/tobymao/sqlglot/issues/7435) opened by [@catlynkong](https://github.com/catlynkong)*
32
+ - [`8a070fd`](https://github.com/tobymao/sqlglot/commit/8a070fd3f9d17c06cf458a9a96ddeb1dba059b31) - **duckdb**: Add transpilation unsupported for COMPRESS function *(PR [#7445](https://github.com/tobymao/sqlglot/pull/7445) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
33
+ - [`eb9dbac`](https://github.com/tobymao/sqlglot/commit/eb9dbac22e361a86fc13fbd49023135e66e2c53e) - **bigquery**: support AI.FORECAST function *(PR [#7457](https://github.com/tobymao/sqlglot/pull/7457) by [@RedZapdos123](https://github.com/RedZapdos123))*
34
+ - :arrow_lower_right: *addresses issue [#7456](https://github.com/tobymao/sqlglot/issues/7456) opened by [@RedZapdos123](https://github.com/RedZapdos123)*
35
+ - [`61bb18c`](https://github.com/tobymao/sqlglot/commit/61bb18cc00a1749f8945e56ff4e83e4c809bd6df) - **snowflake**: Transpilation support for TO_DECIMAL, TO_NUMBER,NUMERIC *(PR [#7315](https://github.com/tobymao/sqlglot/pull/7315) by [@fivetran-ashashankar](https://github.com/fivetran-ashashankar))*
36
+ - [`4c29711`](https://github.com/tobymao/sqlglot/commit/4c29711d3a6c8e08307e0249ec9dab7486d343db) - **duckdb**: Add transpilation support for COLLATION function *(PR [#7443](https://github.com/tobymao/sqlglot/pull/7443) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
37
+ - [`9cf3485`](https://github.com/tobymao/sqlglot/commit/9cf3485eaab80d5e715d9ef9de3c140e9d6c491a) - **snowflake**: parse and generate ROW ACCESS POLICY on views [CLAUDE] *(PR [#7467](https://github.com/tobymao/sqlglot/pull/7467) by [@eakmanrq](https://github.com/eakmanrq))*
38
+
39
+ ### :bug: Bug Fixes
40
+ - [`09b5912`](https://github.com/tobymao/sqlglot/commit/09b59124c960dcf3415ef445faaabe5023e9f61c) - **sqlite**: support PRAGMA full syntax *(PR [#7441](https://github.com/tobymao/sqlglot/pull/7441) by [@geooo109](https://github.com/geooo109))*
41
+ - :arrow_lower_right: *fixes issue [#7437](https://github.com/tobymao/sqlglot/issues/7437) opened by [@ppacac](https://github.com/ppacac)*
42
+ - [`b61a85f`](https://github.com/tobymao/sqlglot/commit/b61a85f00b763df819c260e186a1e0b66c0086a9) - **bigquery**: column offset *(PR [#7451](https://github.com/tobymao/sqlglot/pull/7451) by [@geooo109](https://github.com/geooo109))*
43
+ - :arrow_lower_right: *fixes issue [#7447](https://github.com/tobymao/sqlglot/issues/7447) opened by [@roykoand](https://github.com/roykoand)*
44
+ - [`b7c057d`](https://github.com/tobymao/sqlglot/commit/b7c057dad7720e62243da57df2d024266d4fd64d) - **bigquery**: pipe syntax DISTINCT *(PR [#7450](https://github.com/tobymao/sqlglot/pull/7450) by [@geooo109](https://github.com/geooo109))*
45
+ - :arrow_lower_right: *fixes issue [#7449](https://github.com/tobymao/sqlglot/issues/7449) opened by [@roykoand](https://github.com/roykoand)*
46
+ - [`2b3dba1`](https://github.com/tobymao/sqlglot/commit/2b3dba155aa0159e8afabbc86af4283955ac92bb) - **presto**: iterate over copy in eliminate_semi_and_anti_joins *(PR [#7455](https://github.com/tobymao/sqlglot/pull/7455) by [@Evgeniy-Sinyak](https://github.com/Evgeniy-Sinyak))*
47
+ - [`2fc0c25`](https://github.com/tobymao/sqlglot/commit/2fc0c257d7762b8cef156619451d0c4233f6ea7e) - **bigquery**: parse MODEL-first AI/ML GENERATE signatures *(PR [#7463](https://github.com/tobymao/sqlglot/pull/7463) by [@RedZapdos123](https://github.com/RedZapdos123))*
48
+ - :arrow_lower_right: *fixes issue [#7462](https://github.com/tobymao/sqlglot/issues/7462) opened by [@RedZapdos123](https://github.com/RedZapdos123)*
49
+
50
+ ### :recycle: Refactors
51
+ - [`4deba62`](https://github.com/tobymao/sqlglot/commit/4deba626c6ee94693a7079c085b80d7eaa619487) - **typing**: add annotations in dialect/parser/schema modules *(PR [#7444](https://github.com/tobymao/sqlglot/pull/7444) by [@OutSquareCapital](https://github.com/OutSquareCapital))*
52
+ - [`c31e2e3`](https://github.com/tobymao/sqlglot/commit/c31e2e3a6994c0c5eeda7d4374d94fc3048c84e0) - **Optimizer**: improve typing coverage of optimizer modules *(PR [#7446](https://github.com/tobymao/sqlglot/pull/7446) by [@OutSquareCapital](https://github.com/OutSquareCapital))*
53
+ - [`08b51e8`](https://github.com/tobymao/sqlglot/commit/08b51e81e0092c63a565f46ec0ccad178006d5df) - use ruff UP rule to modernize coding style *(PR [#7459](https://github.com/tobymao/sqlglot/pull/7459) by [@georgesittas](https://github.com/georgesittas))*
54
+
55
+ ### :wrench: Chores
56
+ - [`2e7dec0`](https://github.com/tobymao/sqlglot/commit/2e7dec0c1129e8af28e2ec9b8e0c12282701abc6) - Bump sqlglot-mypy to 1.20 *(PR [#7439](https://github.com/tobymao/sqlglot/pull/7439) by [@VaggelisD](https://github.com/VaggelisD))*
57
+ - [`500e0ce`](https://github.com/tobymao/sqlglot/commit/500e0ce1785a90eb29f7d4e0bf0511db08843219) - Fix uv sync picking up sqlglotc in python 3.9 *(PR [#7452](https://github.com/tobymao/sqlglot/pull/7452) by [@VaggelisD](https://github.com/VaggelisD))*
58
+ - [`0445c24`](https://github.com/tobymao/sqlglot/commit/0445c24577b093154105efaf57b8cd1a147abc7e) - Revert setup.py for sqlglot-mypy *(PR [#7458](https://github.com/tobymao/sqlglot/pull/7458) by [@VaggelisD](https://github.com/VaggelisD))*
59
+ - [`576b5a8`](https://github.com/tobymao/sqlglot/commit/576b5a8ae47e7108c69bdded53729c1e4cb3df1d) - add MaxCompute plugin to dialects list *(PR [#7466](https://github.com/tobymao/sqlglot/pull/7466) by [@azurechen97](https://github.com/azurechen97))*
60
+
61
+
4
62
  ## [v30.2.1] - 2026-04-02
5
63
  ### :bug: Bug Fixes
6
64
  - [`6983aed`](https://github.com/tobymao/sqlglot/commit/6983aedacc47b4adc127fb7e6ce9e0230f9b94f4) - **postgres**: `_date_add_sql` bug w/ interval inputs *(PR [#7440](https://github.com/tobymao/sqlglot/pull/7440) by [@georgesittas](https://github.com/georgesittas))*
@@ -14077,3 +14135,5 @@ pip install "sqlglot[c]" # compiled — faster, but no subclassing
14077
14135
  [v30.1.0]: https://github.com/tobymao/sqlglot/compare/v30.0.3...v30.1.0
14078
14136
  [v30.2.0]: https://github.com/tobymao/sqlglot/compare/v30.1.0...v30.2.0
14079
14137
  [v30.2.1]: https://github.com/tobymao/sqlglot/compare/v30.2.0...v30.2.1
14138
+ [v30.3.0]: https://github.com/tobymao/sqlglot/compare/v30.2.1...v30.3.0
14139
+ [v30.4.0]: https://github.com/tobymao/sqlglot/compare/v30.3.0...v30.4.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 30.3.0
3
+ Version: 30.4.2
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
@@ -33,10 +33,10 @@ Requires-Dist: types-pytz; extra == "dev"
33
33
  Requires-Dist: typing_extensions; extra == "dev"
34
34
  Requires-Dist: pyperf; extra == "dev"
35
35
  Provides-Extra: c
36
- Requires-Dist: sqlglotc==30.3.0; extra == "c"
36
+ Requires-Dist: sqlglotc==30.4.2; extra == "c"
37
37
  Provides-Extra: rs
38
38
  Requires-Dist: sqlglotrs==0.13.0; extra == "rs"
39
- Requires-Dist: sqlglotc==30.3.0; extra == "rs"
39
+ Requires-Dist: sqlglotc==30.4.2; extra == "rs"
40
40
  Dynamic: license-file
41
41
  Dynamic: provides-extra
42
42
 
@@ -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.3.0'
22
- __version_tuple__ = version_tuple = (30, 3, 0)
21
+ __version__ = version = '30.4.2'
22
+ __version_tuple__ = version_tuple = (30, 4, 2)
23
23
 
24
- __commit_id__ = commit_id = 'g9cf3485ea'
24
+ __commit_id__ = commit_id = 'gd04595e1b'
@@ -3416,6 +3416,17 @@ class Generator:
3416
3416
  return self.func("CONCAT", *expressions)
3417
3417
 
3418
3418
  def concatws_sql(self, expression: exp.ConcatWs) -> str:
3419
+ if self.dialect.CONCAT_COALESCE and not expression.args.get("coalesce"):
3420
+ # Dialect's CONCAT_WS function coalesces NULLs to empty strings, but the expression does not.
3421
+ # Wrap the entire call in a CASE expression that returns NULL if any input IS NULL.
3422
+ all_args = expression.expressions
3423
+ expression.set("coalesce", True)
3424
+ return self.sql(
3425
+ exp.case()
3426
+ .when(exp.or_(*(arg.is_(exp.null()) for arg in all_args)), exp.null())
3427
+ .else_(expression)
3428
+ )
3429
+
3419
3430
  return self.func(
3420
3431
  "CONCAT_WS", seq_get(expression.expressions, 0), *self.convert_concat_args(expression)
3421
3432
  )
@@ -82,6 +82,13 @@ WEEK_START_DAY_TO_DOW = {
82
82
 
83
83
  MAX_BIT_POSITION = exp.Literal.number(32768)
84
84
 
85
+ # cs/as/ps are Snowflake defaults; DuckDB already behaves the same way, so they are safe to drop.
86
+ # Note: "as" is also a reserved keyword in DuckDB, making it impossible to pass through.
87
+ _SNOWFLAKE_COLLATION_DEFAULTS = frozenset({"cs", "as", "ps"})
88
+ _SNOWFLAKE_COLLATION_UNSUPPORTED = frozenset(
89
+ {"ci", "ai", "upper", "lower", "utf8", "bin", "pi", "fl", "fu", "trim", "ltrim", "rtrim"}
90
+ )
91
+
85
92
  # Window functions that support IGNORE/RESPECT NULLS in DuckDB
86
93
  _IGNORE_RESPECT_NULLS_WINDOW_FUNCTIONS = (
87
94
  exp.FirstValue,
@@ -2997,6 +3004,30 @@ class DuckDBGenerator(generator.Generator):
2997
3004
  self.unsupported("COLLATION function is not supported by DuckDB")
2998
3005
  return self.function_fallback_sql(expression)
2999
3006
 
3007
+ def collate_sql(self, expression: exp.Collate) -> str:
3008
+ if not expression.expression.is_string:
3009
+ return super().collate_sql(expression)
3010
+
3011
+ raw = expression.expression.name
3012
+ if not raw:
3013
+ return self.sql(expression.this)
3014
+
3015
+ parts = []
3016
+ for part in raw.split("-"):
3017
+ lower = part.lower()
3018
+ if lower not in _SNOWFLAKE_COLLATION_DEFAULTS:
3019
+ if lower in _SNOWFLAKE_COLLATION_UNSUPPORTED:
3020
+ self.unsupported(
3021
+ f"Snowflake collation specifier '{part}' has no DuckDB equivalent"
3022
+ )
3023
+ parts.append(lower)
3024
+
3025
+ if not parts:
3026
+ return self.sql(expression.this)
3027
+ return super().collate_sql(
3028
+ exp.Collate(this=expression.this, expression=exp.var(".".join(parts)))
3029
+ )
3030
+
3000
3031
  def _validate_regexp_flags(self, flags: exp.Expr | None, supported_flags: str) -> str | None:
3001
3032
  """
3002
3033
  Validate and filter regexp flags for DuckDB compatibility.
@@ -3362,6 +3393,9 @@ class DuckDBGenerator(generator.Generator):
3362
3393
  def right_sql(self, expression: exp.Right) -> str:
3363
3394
  return self._left_right_sql(expression, "RIGHT")
3364
3395
 
3396
+ def rtrimmedlength_sql(self, expression: exp.RtrimmedLength) -> str:
3397
+ return self.func("LENGTH", exp.Trim(this=expression.this, position="TRAILING"))
3398
+
3365
3399
  def rand_sql(self, expression: exp.Rand) -> str:
3366
3400
  seed = expression.this
3367
3401
  if seed is not None:
@@ -3733,6 +3767,21 @@ class DuckDBGenerator(generator.Generator):
3733
3767
 
3734
3768
  return self.func("ARRAY_TO_STRING", expression.this, expression.expression)
3735
3769
 
3770
+ def concatws_sql(self, expression: exp.ConcatWs) -> str:
3771
+ # DuckDB-specific: handle binary types using DPipe (||) operator
3772
+ separator = seq_get(expression.expressions, 0)
3773
+ args = expression.expressions[1:]
3774
+
3775
+ if any(_is_binary(arg) for arg in [separator, *args]):
3776
+ result = args[0]
3777
+ for arg in args[1:]:
3778
+ result = exp.DPipe(
3779
+ this=exp.DPipe(this=result, expression=separator), expression=arg
3780
+ )
3781
+ return self.sql(result)
3782
+
3783
+ return super().concatws_sql(expression)
3784
+
3736
3785
  def _regexp_extract_sql(self, expression: exp.RegexpExtract | exp.RegexpExtractAll) -> str:
3737
3786
  this = expression.this
3738
3787
  group = expression.args.get("group")
@@ -481,6 +481,7 @@ class SnowflakeGenerator(generator.Generator):
481
481
  ),
482
482
  exp.CosineDistance: rename_func("VECTOR_COSINE_SIMILARITY"),
483
483
  exp.EuclideanDistance: rename_func("VECTOR_L2_DISTANCE"),
484
+ exp.HandlerProperty: lambda self, e: f"HANDLER = {self.sql(e, 'this')}",
484
485
  exp.FileFormatProperty: lambda self, e: (
485
486
  f"FILE_FORMAT=({self.expressions(e, 'expressions', sep=' ')})"
486
487
  ),
@@ -5399,7 +5399,11 @@ class Parser:
5399
5399
  comments = self._prev_comments
5400
5400
  if top:
5401
5401
  limit_paren = self._match(TokenType.L_PAREN)
5402
- expression = self._parse_term() if limit_paren else self._parse_number()
5402
+ expression = (
5403
+ self._parse_term() or self._parse_select()
5404
+ if limit_paren
5405
+ else self._parse_number()
5406
+ )
5403
5407
 
5404
5408
  if limit_paren:
5405
5409
  self._match_r_paren()
@@ -18,7 +18,7 @@ if t.TYPE_CHECKING:
18
18
  from collections.abc import Sequence
19
19
  from typing_extensions import Unpack
20
20
 
21
- ColumnMapping = t.Union[dict[str, str], str, list[str]]
21
+ ColumnMapping = t.Union[dict, str, list]
22
22
 
23
23
 
24
24
  @trait
@@ -708,13 +708,7 @@ def ensure_schema(
708
708
  return MappingSchema(schema, **kwargs)
709
709
 
710
710
 
711
- @t.overload
712
- def ensure_column_mapping(mapping: list[str] | None) -> dict[str, None]: ...
713
- @t.overload
714
- def ensure_column_mapping(mapping: dict[str, str]) -> dict[str, str]: ...
715
- @t.overload
716
- def ensure_column_mapping(mapping: ColumnMapping | None) -> dict[str, None] | dict[str, str]: ...
717
- def ensure_column_mapping(mapping: ColumnMapping | None) -> dict[str, None] | dict[str, str]:
711
+ def ensure_column_mapping(mapping: ColumnMapping | None) -> dict:
718
712
  if mapping is None:
719
713
  return {}
720
714
  elif isinstance(mapping, dict):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 30.3.0
3
+ Version: 30.4.2
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
@@ -33,10 +33,10 @@ Requires-Dist: types-pytz; extra == "dev"
33
33
  Requires-Dist: typing_extensions; extra == "dev"
34
34
  Requires-Dist: pyperf; extra == "dev"
35
35
  Provides-Extra: c
36
- Requires-Dist: sqlglotc==30.3.0; extra == "c"
36
+ Requires-Dist: sqlglotc==30.4.2; extra == "c"
37
37
  Provides-Extra: rs
38
38
  Requires-Dist: sqlglotrs==0.13.0; extra == "rs"
39
- Requires-Dist: sqlglotc==30.3.0; extra == "rs"
39
+ Requires-Dist: sqlglotc==30.4.2; extra == "rs"
40
40
  Dynamic: license-file
41
41
  Dynamic: provides-extra
42
42
 
@@ -1,6 +1,6 @@
1
1
 
2
2
  [c]
3
- sqlglotc==30.3.0
3
+ sqlglotc==30.4.2
4
4
 
5
5
  [dev]
6
6
  duckdb>=0.6
@@ -20,4 +20,4 @@ pyperf
20
20
 
21
21
  [rs]
22
22
  sqlglotrs==0.13.0
23
- sqlglotc==30.3.0
23
+ sqlglotc==30.4.2
@@ -2449,7 +2449,7 @@ class TestDialect(Validator):
2449
2449
  "CONCAT_WS('-', 'a', 'b')",
2450
2450
  write={
2451
2451
  "clickhouse": "CONCAT_WS('-', 'a', 'b')",
2452
- "duckdb": "CONCAT_WS('-', 'a', 'b')",
2452
+ "duckdb": "CASE WHEN '-' IS NULL OR 'a' IS NULL OR 'b' IS NULL THEN NULL ELSE CONCAT_WS('-', 'a', 'b') END",
2453
2453
  "presto": "CONCAT_WS('-', CAST('a' AS VARCHAR), CAST('b' AS VARCHAR))",
2454
2454
  "hive": "CONCAT_WS('-', 'a', 'b')",
2455
2455
  "spark": "CONCAT_WS('-', 'a', 'b')",
@@ -2461,7 +2461,7 @@ class TestDialect(Validator):
2461
2461
  "CONCAT_WS('-', x)",
2462
2462
  write={
2463
2463
  "clickhouse": "CONCAT_WS('-', x)",
2464
- "duckdb": "CONCAT_WS('-', x)",
2464
+ "duckdb": "CASE WHEN '-' IS NULL OR x IS NULL THEN NULL ELSE CONCAT_WS('-', x) END",
2465
2465
  "hive": "CONCAT_WS('-', x)",
2466
2466
  "presto": "CONCAT_WS('-', CAST(x AS VARCHAR))",
2467
2467
  "spark": "CONCAT_WS('-', x)",
@@ -4419,6 +4419,10 @@ class TestSnowflake(Validator):
4419
4419
  },
4420
4420
  )
4421
4421
 
4422
+ self.validate_identity(
4423
+ "CREATE OR REPLACE FUNCTION repro_fn() RETURNS INT LANGUAGE PYTHON HANDLER = 'fn' RUNTIME_VERSION='3.11' PACKAGES=() AS '\\ndef fn():\\n return 1\\n'"
4424
+ )
4425
+
4422
4426
  def test_stored_procedures(self):
4423
4427
  self.validate_identity("CALL a.b.c(x, y)", check_command_warning=True)
4424
4428
  self.validate_identity(
@@ -19,6 +19,7 @@ class TestTSQL(Validator):
19
19
  # tsql allows .. which means use the default schema
20
20
  self.validate_identity("SELECT * FROM a..b")
21
21
 
22
+ self.validate_identity("SELECT TOP (SELECT 1) * FROM t")
22
23
  self.validate_identity("SELECT ATN2(x, y)")
23
24
  self.validate_identity("SELECT EXP(1)")
24
25
  self.validate_identity("SELECT SYSDATETIMEOFFSET()")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes