sqlglot 30.11.0__tar.gz → 30.12.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 (329) hide show
  1. {sqlglot-30.11.0 → sqlglot-30.12.0}/CHANGELOG.md +30 -0
  2. {sqlglot-30.11.0 → sqlglot-30.12.0}/Makefile +5 -1
  3. {sqlglot-30.11.0/sqlglot.egg-info → sqlglot-30.12.0}/PKG-INFO +4 -4
  4. {sqlglot-30.11.0 → sqlglot-30.12.0}/setup.py +1 -1
  5. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/_version.py +3 -3
  6. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/dialect.py +7 -3
  7. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/postgres.py +1 -0
  8. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/snowflake.py +3 -0
  9. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/array.py +4 -0
  10. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/core.py +23 -10
  11. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/ddl.py +8 -0
  12. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/json.py +4 -0
  13. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/properties.py +5 -1
  14. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/query.py +2 -2
  15. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/temporal.py +5 -1
  16. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generator.py +64 -13
  17. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/clickhouse.py +4 -1
  18. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/databricks.py +1 -0
  19. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/duckdb.py +155 -6
  20. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/exasol.py +1 -3
  21. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/mysql.py +4 -0
  22. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/postgres.py +1 -1
  23. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/presto.py +2 -0
  24. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/snowflake.py +15 -1
  25. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/starrocks.py +15 -1
  26. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/qualify_columns.py +21 -3
  27. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/qualify_tables.py +7 -1
  28. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/resolver.py +4 -0
  29. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/simplify.py +57 -22
  30. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parser.py +63 -29
  31. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/bigquery.py +8 -3
  32. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/clickhouse.py +5 -0
  33. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/databricks.py +1 -0
  34. sqlglot-30.12.0/sqlglot/parsers/druid.py +10 -0
  35. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/exasol.py +3 -2
  36. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/postgres.py +1 -0
  37. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/snowflake.py +75 -3
  38. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/starrocks.py +4 -1
  39. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/tokenizer_core.py +2 -0
  40. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/tokens.py +2 -2
  41. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/__init__.py +5 -4
  42. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/bigquery.py +42 -4
  43. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/hive.py +3 -1
  44. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/mysql.py +1 -0
  45. {sqlglot-30.11.0 → sqlglot-30.12.0/sqlglot.egg-info}/PKG-INFO +4 -4
  46. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot.egg-info/SOURCES.txt +2 -0
  47. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot.egg-info/requires.txt +3 -3
  48. sqlglot-30.12.0/sqlglot.egg-info/scm_file_list.json +354 -0
  49. sqlglot-30.12.0/sqlglot.egg-info/scm_version.json +8 -0
  50. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglotc/pyproject.toml +2 -2
  51. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_bigquery.py +19 -0
  52. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_clickhouse.py +3 -0
  53. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_databricks.py +3 -2
  54. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_druid.py +6 -0
  55. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_duckdb.py +27 -5
  56. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_exasol.py +16 -0
  57. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_postgres.py +9 -5
  58. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_presto.py +17 -0
  59. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_snowflake.py +50 -4
  60. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_sqlite.py +12 -0
  61. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_starrocks.py +94 -0
  62. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/identity.sql +1 -0
  63. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/annotate_functions.sql +119 -0
  64. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/qualify_columns.sql +12 -0
  65. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/qualify_tables.sql +5 -0
  66. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/simplify.sql +40 -1
  67. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_optimizer.py +49 -0
  68. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_transpile.py +30 -4
  69. sqlglot-30.11.0/sqlglot/parsers/druid.py +0 -7
  70. {sqlglot-30.11.0 → sqlglot-30.12.0}/.gitignore +0 -0
  71. {sqlglot-30.11.0 → sqlglot-30.12.0}/.gitmodules +0 -0
  72. {sqlglot-30.11.0 → sqlglot-30.12.0}/.gitpod.yml +0 -0
  73. {sqlglot-30.11.0 → sqlglot-30.12.0}/.pre-commit-config.yaml +0 -0
  74. {sqlglot-30.11.0 → sqlglot-30.12.0}/AGENTS.md +0 -0
  75. {sqlglot-30.11.0 → sqlglot-30.12.0}/CLAUDE.md +0 -0
  76. {sqlglot-30.11.0 → sqlglot-30.12.0}/CONTRIBUTING.md +0 -0
  77. {sqlglot-30.11.0 → sqlglot-30.12.0}/LICENSE +0 -0
  78. {sqlglot-30.11.0 → sqlglot-30.12.0}/MANIFEST.in +0 -0
  79. {sqlglot-30.11.0 → sqlglot-30.12.0}/README.md +0 -0
  80. {sqlglot-30.11.0 → sqlglot-30.12.0}/pyproject.toml +0 -0
  81. {sqlglot-30.11.0 → sqlglot-30.12.0}/setup.cfg +0 -0
  82. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/__init__.py +0 -0
  83. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/__main__.py +0 -0
  84. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/_typing.py +0 -0
  85. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/__init__.py +0 -0
  86. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/athena.py +0 -0
  87. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/bigquery.py +0 -0
  88. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/clickhouse.py +0 -0
  89. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/databricks.py +0 -0
  90. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/doris.py +0 -0
  91. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/dremio.py +0 -0
  92. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/drill.py +0 -0
  93. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/druid.py +0 -0
  94. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/duckdb.py +0 -0
  95. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/dune.py +0 -0
  96. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/exasol.py +0 -0
  97. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/fabric.py +0 -0
  98. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/hive.py +0 -0
  99. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/materialize.py +0 -0
  100. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/mysql.py +0 -0
  101. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/oracle.py +0 -0
  102. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/presto.py +0 -0
  103. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/prql.py +0 -0
  104. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/redshift.py +0 -0
  105. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/risingwave.py +0 -0
  106. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/singlestore.py +0 -0
  107. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/solr.py +0 -0
  108. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/spark.py +0 -0
  109. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/spark2.py +0 -0
  110. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/sqlite.py +0 -0
  111. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/starrocks.py +0 -0
  112. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/tableau.py +0 -0
  113. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/teradata.py +0 -0
  114. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/trino.py +0 -0
  115. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/dialects/tsql.py +0 -0
  116. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/diff.py +0 -0
  117. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/errors.py +0 -0
  118. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/executor/__init__.py +0 -0
  119. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/executor/context.py +0 -0
  120. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/executor/env.py +0 -0
  121. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/executor/python.py +0 -0
  122. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/executor/table.py +0 -0
  123. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/__init__.py +0 -0
  124. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/aggregate.py +0 -0
  125. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/builders.py +0 -0
  126. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/constraints.py +0 -0
  127. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/datatypes.py +0 -0
  128. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/dml.py +0 -0
  129. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/functions.py +0 -0
  130. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/math.py +0 -0
  131. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/expressions/string.py +0 -0
  132. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/__init__.py +0 -0
  133. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/athena.py +0 -0
  134. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/bigquery.py +0 -0
  135. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/doris.py +0 -0
  136. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/dremio.py +0 -0
  137. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/drill.py +0 -0
  138. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/druid.py +0 -0
  139. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/dune.py +0 -0
  140. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/fabric.py +0 -0
  141. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/hive.py +0 -0
  142. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/materialize.py +0 -0
  143. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/oracle.py +0 -0
  144. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/prql.py +0 -0
  145. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/python.py +0 -0
  146. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/redshift.py +0 -0
  147. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/risingwave.py +0 -0
  148. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/singlestore.py +0 -0
  149. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/solr.py +0 -0
  150. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/spark.py +0 -0
  151. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/spark2.py +0 -0
  152. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/sqlite.py +0 -0
  153. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/tableau.py +0 -0
  154. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/teradata.py +0 -0
  155. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/trino.py +0 -0
  156. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/generators/tsql.py +0 -0
  157. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/helper.py +0 -0
  158. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/jsonpath.py +0 -0
  159. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/lineage.py +0 -0
  160. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/__init__.py +0 -0
  161. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/annotate_types.py +0 -0
  162. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/canonicalize.py +0 -0
  163. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/canonicalize_internal_names.py +0 -0
  164. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
  165. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
  166. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
  167. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  168. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/merge_subqueries.py +0 -0
  169. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/normalize.py +0 -0
  170. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  171. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/optimize_joins.py +0 -0
  172. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/optimizer.py +0 -0
  173. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
  174. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
  175. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/qualify.py +0 -0
  176. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/scope.py +0 -0
  177. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/optimizer/unnest_subqueries.py +0 -0
  178. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/__init__.py +0 -0
  179. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/athena.py +0 -0
  180. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/base.py +0 -0
  181. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/doris.py +0 -0
  182. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/dremio.py +0 -0
  183. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/drill.py +0 -0
  184. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/duckdb.py +0 -0
  185. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/dune.py +0 -0
  186. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/fabric.py +0 -0
  187. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/hive.py +0 -0
  188. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/materialize.py +0 -0
  189. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/mysql.py +0 -0
  190. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/oracle.py +0 -0
  191. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/presto.py +0 -0
  192. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/prql.py +0 -0
  193. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/redshift.py +0 -0
  194. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/risingwave.py +0 -0
  195. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/singlestore.py +0 -0
  196. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/solr.py +0 -0
  197. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/spark.py +0 -0
  198. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/spark2.py +0 -0
  199. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/sqlite.py +0 -0
  200. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/tableau.py +0 -0
  201. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/teradata.py +0 -0
  202. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/trino.py +0 -0
  203. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/parsers/tsql.py +0 -0
  204. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/planner.py +0 -0
  205. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/py.typed +0 -0
  206. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/schema.py +0 -0
  207. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/serde.py +0 -0
  208. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/time.py +0 -0
  209. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/transforms.py +0 -0
  210. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/trie.py +0 -0
  211. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/clickhouse.py +0 -0
  212. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/duckdb.py +0 -0
  213. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/postgres.py +0 -0
  214. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/presto.py +0 -0
  215. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/redshift.py +0 -0
  216. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/snowflake.py +0 -0
  217. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/spark.py +0 -0
  218. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/spark2.py +0 -0
  219. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot/typing/tsql.py +0 -0
  220. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot.egg-info/dependency_links.txt +0 -0
  221. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot.egg-info/top_level.txt +0 -0
  222. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglot.png +0 -0
  223. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglotc/MANIFEST.in +0 -0
  224. {sqlglot-30.11.0 → sqlglot-30.12.0}/sqlglotc/setup.py +0 -0
  225. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/__init__.py +0 -0
  226. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/__init__.py +0 -0
  227. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_athena.py +0 -0
  228. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_dialect.py +0 -0
  229. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_doris.py +0 -0
  230. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_dremio.py +0 -0
  231. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_drill.py +0 -0
  232. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_dune.py +0 -0
  233. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_fabric.py +0 -0
  234. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_hive.py +0 -0
  235. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_materialize.py +0 -0
  236. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_mysql.py +0 -0
  237. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_oracle.py +0 -0
  238. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_pipe_syntax.py +0 -0
  239. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_prql.py +0 -0
  240. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_redshift.py +0 -0
  241. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_risingwave.py +0 -0
  242. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_singlestore.py +0 -0
  243. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_solr.py +0 -0
  244. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_spark.py +0 -0
  245. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_tableau.py +0 -0
  246. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_teradata.py +0 -0
  247. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_trino.py +0 -0
  248. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/dialects/test_tsql.py +0 -0
  249. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/jsonpath/LICENSE +0 -0
  250. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/jsonpath/cts.json +0 -0
  251. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
  252. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
  253. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/canonicalize_internal_names.sql +0 -0
  254. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
  255. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
  256. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
  257. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
  258. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
  259. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/normalize.sql +0 -0
  260. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
  261. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
  262. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/optimizer.sql +0 -0
  263. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
  264. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
  265. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
  266. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
  267. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
  268. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
  269. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
  270. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
  271. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
  272. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
  273. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
  274. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
  275. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
  276. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
  277. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
  278. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
  279. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
  280. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
  281. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
  282. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
  283. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
  284. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
  285. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
  286. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
  287. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
  288. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
  289. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
  290. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
  291. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
  292. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
  293. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
  294. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
  295. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
  296. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
  297. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
  298. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
  299. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
  300. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
  301. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
  302. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
  303. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
  304. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
  305. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/partial.sql +0 -0
  306. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/fixtures/pretty.sql +0 -0
  307. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/gen_fixtures.py +0 -0
  308. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/helpers.py +0 -0
  309. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/leakcheck.py +0 -0
  310. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/sqlglot/__init__.py +0 -0
  311. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_build.py +0 -0
  312. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_dialect_entry_points.py +0 -0
  313. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_dialect_imports.py +0 -0
  314. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_diff.py +0 -0
  315. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_docs.py +0 -0
  316. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_errors.py +0 -0
  317. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_executor.py +0 -0
  318. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_expressions.py +0 -0
  319. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_generator.py +0 -0
  320. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_helper.py +0 -0
  321. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_integration_loader.py +0 -0
  322. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_jsonpath.py +0 -0
  323. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_lineage.py +0 -0
  324. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_parser.py +0 -0
  325. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_schema.py +0 -0
  326. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_serde.py +0 -0
  327. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_time.py +0 -0
  328. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_tokens.py +0 -0
  329. {sqlglot-30.11.0 → sqlglot-30.12.0}/tests/test_transforms.py +0 -0
@@ -1,6 +1,35 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ ## [v30.11.0] - 2026-06-11
5
+ ### :boom: BREAKING CHANGES
6
+ - 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))*:
7
+
8
+ GET_JSON_OBJECT roundtrip (#7728)
9
+
10
+ - due to [`333e3c7`](https://github.com/tobymao/sqlglot/commit/333e3c7fa82201c0f87160c7e956e6ee18bd14da) - ConcatWs args set incorrectly in `simplify_concat` *(commit by [@georgesittas](https://github.com/georgesittas))*:
11
+
12
+ ConcatWs args set incorrectly in `simplify_concat`
13
+
14
+
15
+ ### :sparkles: New Features
16
+ - [`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))*
17
+ - :arrow_lower_right: *addresses issue [#7727](https://github.com/tobymao/sqlglot/issues/7727) opened by [@tomoki-takahashi-oisix](https://github.com/tomoki-takahashi-oisix)*
18
+ - [`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))*
19
+
20
+ ### :bug: Bug Fixes
21
+ - [`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))*
22
+ - [`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))*
23
+ - [`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))*
24
+ - [`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))*
25
+ - :arrow_lower_right: *fixes issue [#7732](https://github.com/tobymao/sqlglot/issues/7732) opened by [@treff7es](https://github.com/treff7es)*
26
+ - [`333e3c7`](https://github.com/tobymao/sqlglot/commit/333e3c7fa82201c0f87160c7e956e6ee18bd14da) - **optimizer**: ConcatWs args set incorrectly in `simplify_concat` *(commit by [@georgesittas](https://github.com/georgesittas))*
27
+
28
+ ### :zap: Performance Improvements
29
+ - [`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))*
30
+ - [`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))*
31
+
32
+
4
33
  ## [v30.10.0] - 2026-06-09
5
34
  ### :boom: BREAKING CHANGES
6
35
  - 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 +14638,4 @@ pip install "sqlglot[c]" # compiled — faster, but no subclassing
14609
14638
  [v30.8.0]: https://github.com/tobymao/sqlglot/compare/v30.7.0...v30.8.0
14610
14639
  [v30.9.0]: https://github.com/tobymao/sqlglot/compare/v30.8.0...v30.9.0
14611
14640
  [v30.10.0]: https://github.com/tobymao/sqlglot/compare/v30.9.0...v30.10.0
14641
+ [v30.11.0]: https://github.com/tobymao/sqlglot/compare/v30.10.0...v30.11.0
@@ -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.12.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.post3; 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.12.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.12.0; python_version >= "3.10" and extra == "rs"
41
41
  Dynamic: license-file
42
42
  Dynamic: provides-extra
43
43
 
@@ -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.post3; 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.12.0'
22
+ __version_tuple__ = version_tuple = (30, 12, 0)
23
23
 
24
- __commit_id__ = commit_id = 'g333e3c7fa'
24
+ __commit_id__ = commit_id = 'g64e268a5d'
@@ -305,7 +305,12 @@ class _Dialect(type):
305
305
  **klass.UNESCAPED_SEQUENCES,
306
306
  }
307
307
 
308
- klass.ESCAPED_SEQUENCES = {v: k for k, v in klass.UNESCAPED_SEQUENCES.items()}
308
+ klass.ESCAPED_SEQUENCES = {
309
+ # The filter is necessary because of `\\a -> a` in Snowflake; we can't replace `a` with `\a`.
310
+ v: k
311
+ for k, v in klass.UNESCAPED_SEQUENCES.items()
312
+ if not v.isprintable() or v == "\\"
313
+ }
309
314
 
310
315
  klass.SUPPORTS_COLUMN_JOIN_MARKS = "(+)" in klass.tokenizer_class.KEYWORDS
311
316
 
@@ -2134,10 +2139,9 @@ def json_extract_segments(
2134
2139
  if not isinstance(path, exp.JSONPath):
2135
2140
  return rename_func(name)(self, expression)
2136
2141
 
2137
- escape = path.args.get("escape")
2138
-
2139
2142
  segments = []
2140
2143
  for segment in path.expressions:
2144
+ escape = segment.args.get("quoted")
2141
2145
  path = self.sql(segment)
2142
2146
  if path:
2143
2147
  if isinstance(segment, exp.JSONPathPart) and (
@@ -75,6 +75,7 @@ class Postgres(Dialect):
75
75
  **tokens.Tokenizer.KEYWORDS,
76
76
  "~": TokenType.RLIKE,
77
77
  "@@": TokenType.DAT,
78
+ "@?": TokenType.AT_QMARK,
78
79
  "@>": TokenType.AT_GT,
79
80
  "<@": TokenType.LT_AT,
80
81
  "?&": 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,
@@ -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
 
@@ -10,12 +10,14 @@ import re
10
10
  import sys
11
11
  import textwrap
12
12
  import typing as t
13
+ from builtins import type as Type
13
14
  from collections import deque
15
+ from collections.abc import Collection, Iterator, Mapping, MutableMapping, Sequence
14
16
  from copy import deepcopy
15
17
  from decimal import Decimal
16
18
  from functools import reduce
17
- from collections.abc import Iterator, Sequence, Collection, Mapping, MutableMapping
18
- from sqlglot._typing import E, T
19
+
20
+ from sqlglot._typing import E, GeneratorNoDialectArgs, ParserNoDialectArgs, T
19
21
  from sqlglot.errors import ParseError
20
22
  from sqlglot.helper import (
21
23
  camel_to_snake_case,
@@ -24,17 +26,15 @@ from sqlglot.helper import (
24
26
  to_bool,
25
27
  trait,
26
28
  )
27
-
28
29
  from sqlglot.tokenizer_core import Token
29
- from builtins import type as Type
30
- from sqlglot._typing import GeneratorNoDialectArgs, ParserNoDialectArgs
31
30
 
32
31
  if t.TYPE_CHECKING:
33
- from typing_extensions import Self, Unpack, Concatenate
32
+ from typing_extensions import Concatenate, Self, Unpack
33
+
34
+ from sqlglot._typing import P
34
35
  from sqlglot.dialects.dialect import DialectType
35
36
  from sqlglot.expressions.datatypes import DATA_TYPE, DataType, DType, Interval
36
37
  from sqlglot.expressions.query import Select
37
- from sqlglot._typing import P
38
38
 
39
39
  R = t.TypeVar("R")
40
40
 
@@ -1789,7 +1789,12 @@ class JoinHint(Expression):
1789
1789
 
1790
1790
 
1791
1791
  class Identifier(Expression):
1792
- arg_types = {"this": True, "quoted": False, "global_": False, "temporary": False}
1792
+ arg_types = {
1793
+ "this": True,
1794
+ "quoted": False,
1795
+ "global_": False,
1796
+ "temporary": False,
1797
+ }
1793
1798
  is_primitive = True
1794
1799
  _hash_raw_args = True
1795
1800
 
@@ -1802,12 +1807,19 @@ class Identifier(Expression):
1802
1807
  return self.name
1803
1808
 
1804
1809
 
1810
+ # https://docs.snowflake.com/en/sql-reference/identifier-literal
1811
+ # "expressions" holds the arguments when the resolved identifier is invoked as a
1812
+ # function, e.g. `IDENTIFIER('my_func')(1, 2)`
1813
+ class DynamicIdentifier(Expression, Func):
1814
+ arg_types = {"this": True, "expressions": False}
1815
+
1816
+
1805
1817
  class Opclass(Expression):
1806
1818
  arg_types = {"this": True, "expression": True}
1807
1819
 
1808
1820
 
1809
1821
  class Star(Expression):
1810
- arg_types = {"except_": False, "replace": False, "rename": False}
1822
+ arg_types = {"except_": False, "replace": False, "rename": False, "ilike": False}
1811
1823
 
1812
1824
  @property
1813
1825
  def name(self) -> str:
@@ -2415,7 +2427,8 @@ def convert(value: t.Any, copy: bool = False) -> Expr:
2415
2427
 
2416
2428
  return _Array(expressions=[convert(v, copy=copy) for v in value])
2417
2429
  if isinstance(value, dict):
2418
- from sqlglot.expressions.array import Array as _Array, Map as _Map
2430
+ from sqlglot.expressions.array import Array as _Array
2431
+ from sqlglot.expressions.array import Map as _Map
2419
2432
 
2420
2433
  return _Map(
2421
2434
  keys=_Array(expressions=[convert(k, copy=copy) for k in value]),
@@ -370,6 +370,14 @@ class DropPrimaryKey(Expression):
370
370
  arg_types = {}
371
371
 
372
372
 
373
+ class Undrop(Expression):
374
+ arg_types = {"this": True, "kind": True, "rename": False}
375
+
376
+ @property
377
+ def kind(self) -> str:
378
+ return self.args["kind"].upper()
379
+
380
+
373
381
  class Command(Expression):
374
382
  arg_types = {"this": True, "expression": False}
375
383
 
@@ -62,6 +62,10 @@ class JSONBDeleteAtPath(Expression, Binary, Func):
62
62
  pass
63
63
 
64
64
 
65
+ class JSONBPathExists(Expression, Binary, Predicate, Func):
66
+ pass
67
+
68
+
65
69
  class JSONBExists(Expression, Func):
66
70
  arg_types = {"this": True, "path": True}
67
71
  _sql_names = ["JSONB_EXISTS"]
@@ -5,8 +5,8 @@ from __future__ import annotations
5
5
  import typing as t
6
6
  from enum import auto
7
7
 
8
+ from sqlglot.expressions.core import ColumnConstraintKind, Expression, Literal, convert
8
9
  from sqlglot.helper import AutoName
9
- from sqlglot.expressions.core import Expression, ColumnConstraintKind, Literal, convert
10
10
 
11
11
 
12
12
  class Property(Expression):
@@ -63,6 +63,10 @@ class BlockCompressionProperty(Property):
63
63
  }
64
64
 
65
65
 
66
+ class CalledOnNullInputProperty(Property):
67
+ arg_types = {}
68
+
69
+
66
70
  class CatalogProperty(Property):
67
71
  arg_types = {}
68
72
 
@@ -1967,7 +1967,7 @@ class JSON(Expression):
1967
1967
 
1968
1968
 
1969
1969
  class JSONPath(Expression):
1970
- arg_types = {"expressions": True, "escape": False}
1970
+ arg_types = {"expressions": True}
1971
1971
 
1972
1972
  @property
1973
1973
  def output_name(self) -> str:
@@ -1984,7 +1984,7 @@ class JSONPathFilter(JSONPathPart):
1984
1984
 
1985
1985
 
1986
1986
  class JSONPathKey(JSONPathPart):
1987
- arg_types = {"this": True}
1987
+ arg_types = {"this": True, "quoted": False}
1988
1988
 
1989
1989
 
1990
1990
  class JSONPathRecursive(JSONPathPart):
@@ -437,8 +437,12 @@ class FromISO8601Timestamp(Expression, Func):
437
437
  _sql_names = ["FROM_ISO8601_TIMESTAMP"]
438
438
 
439
439
 
440
+ class FromISO8601Date(Expression, Func):
441
+ _sql_names = ["FROM_ISO8601_DATE"]
442
+
443
+
440
444
  class ParseDatetime(Expression, Func):
441
- arg_types = {"this": True, "format": False, "zone": False}
445
+ arg_types = {"this": True, "format": False, "zone": False, "default_year": False}
442
446
 
443
447
 
444
448
  class ParseTime(Expression, Func):
@@ -9,6 +9,7 @@ from functools import reduce, wraps
9
9
  from sqlglot import exp
10
10
  from sqlglot.errors import ErrorLevel, UnsupportedError, concat_messages
11
11
  from sqlglot.expressions import apply_index_offset
12
+ from sqlglot.expressions.core import maybe_parse
12
13
  from sqlglot.helper import csv, name_sequence, seq_get
13
14
  from sqlglot.jsonpath import ALL_JSON_PATH_PARTS, JSON_PATH_PART_TRANSFORMS
14
15
  from sqlglot.time import format_time
@@ -139,6 +140,7 @@ class Generator:
139
140
  ),
140
141
  exp.AnalyzeColumns: lambda self, e: self.sql(e, "this"),
141
142
  exp.AnalyzeWith: lambda self, e: self.expressions(e, prefix="WITH ", sep=" "),
143
+ exp.ArrayContainedBy: lambda self, e: self.binary(e, "<@"),
142
144
  exp.ArrayContainsAll: lambda self, e: self.binary(e, "@>"),
143
145
  exp.ArrayOverlaps: lambda self, e: self.binary(e, "&&"),
144
146
  exp.AssumeColumnConstraint: lambda self, e: f"ASSUME ({self.sql(e, 'this')})",
@@ -147,6 +149,7 @@ class Generator:
147
149
  exp.CaseSpecificColumnConstraint: lambda _, e: (
148
150
  f"{'NOT ' if e.args.get('not_') else ''}CASESPECIFIC"
149
151
  ),
152
+ exp.CalledOnNullInputProperty: lambda *_: "CALLED ON NULL INPUT",
150
153
  exp.Ceil: lambda self, e: self.ceil_floor(e),
151
154
  exp.CharacterSetColumnConstraint: lambda self, e: f"CHARACTER SET {self.sql(e, 'this')}",
152
155
  exp.CharacterSetProperty: lambda self, e: (
@@ -203,6 +206,7 @@ class Generator:
203
206
  exp.JSONBContainsAnyTopKeys: lambda self, e: self.binary(e, "?|"),
204
207
  exp.JSONBContainsAllTopKeys: lambda self, e: self.binary(e, "?&"),
205
208
  exp.JSONBDeleteAtPath: lambda self, e: self.binary(e, "#-"),
209
+ exp.JSONBPathExists: lambda self, e: self.binary(e, "@?"),
206
210
  exp.JSONObject: lambda self, e: self._jsonobject_sql(e),
207
211
  exp.JSONObjectAgg: lambda self, e: self._jsonobject_sql(e),
208
212
  exp.LanguageProperty: lambda self, e: self.naked_property(e),
@@ -489,6 +493,12 @@ class Generator:
489
493
  # Whether to escape keys using single quotes in JSON paths
490
494
  JSON_PATH_SINGLE_QUOTE_ESCAPE = False
491
495
 
496
+ # Whether a quoted JSON path key (e.g. from a quoted identifier or ['key'] bracket) must be
497
+ # rendered in bracket form to preserve its case-sensitivity, even if it would otherwise match
498
+ # SAFE_JSON_PATH_KEY_RE and render as a bare dotted key. Needed for dialects like Databricks
499
+ # where a bare colon key is case-insensitive but a bracketed key is case-sensitive.
500
+ JSON_PATH_KEY_QUOTED_FORCES_BRACKETS = False
501
+
492
502
  # The JSONPathPart expressions supported by this dialect
493
503
  SUPPORTED_JSON_PATH_PARTS: t.ClassVar = ALL_JSON_PATH_PARTS.copy()
494
504
 
@@ -668,6 +678,7 @@ class Generator:
668
678
  exp.AutoRefreshProperty: exp.Properties.Location.POST_SCHEMA,
669
679
  exp.BackupProperty: exp.Properties.Location.POST_SCHEMA,
670
680
  exp.BlockCompressionProperty: exp.Properties.Location.POST_NAME,
681
+ exp.CalledOnNullInputProperty: exp.Properties.Location.POST_SCHEMA,
671
682
  exp.CatalogProperty: exp.Properties.Location.POST_CREATE,
672
683
  exp.CharacterSetProperty: exp.Properties.Location.POST_SCHEMA,
673
684
  exp.ChecksumProperty: exp.Properties.Location.POST_NAME,
@@ -1007,23 +1018,24 @@ class Generator:
1007
1018
  if not comments or isinstance(expression, self.EXCLUDE_COMMENTS):
1008
1019
  return sql
1009
1020
 
1010
- comments_sql = " ".join(
1011
- f"/*{self.sanitize_comment(comment)}*/" for comment in comments if comment
1012
- )
1021
+ comments_list = [
1022
+ f"/*{self._replace_line_breaks(self.sanitize_comment(comment))}*/"
1023
+ for comment in comments
1024
+ if comment
1025
+ ]
1013
1026
 
1014
- if not comments_sql:
1027
+ if not comments_list:
1015
1028
  return sql
1016
1029
 
1017
- comments_sql = self._replace_line_breaks(comments_sql)
1018
-
1019
1030
  if separated or isinstance(expression, self.WITH_SEPARATED_COMMENTS):
1031
+ comments_sql = self.sep().join(comments_list)
1020
1032
  return (
1021
1033
  f"{self.sep()}{comments_sql}{sql}"
1022
1034
  if not sql or sql[0].isspace()
1023
1035
  else f"{comments_sql}{self.sep()}{sql}"
1024
1036
  )
1025
1037
 
1026
- return f"{sql} {comments_sql}"
1038
+ return f"{sql} {' '.join(comments_list)}"
1027
1039
 
1028
1040
  def wrap(self, expression: exp.Expr | str) -> str:
1029
1041
  this_sql = (
@@ -1945,6 +1957,20 @@ class Generator:
1945
1957
  params = self.sql(expression, "params")
1946
1958
  return f"{unique}{primary}{amp}{index}{name}{table}{params}"
1947
1959
 
1960
+ def dynamicidentifier_sql(self, expression: exp.DynamicIdentifier) -> str:
1961
+ this = expression.this
1962
+ if this and this.is_string:
1963
+ resolved = maybe_parse(this.name).sql(self.dialect)
1964
+ if "expressions" in expression.args:
1965
+ # `IDENTIFIER(...)` invoked as a function, e.g. `IDENTIFIER('my_func')(1, 2)`
1966
+ # We can't safely emit the call to other dialects since name/arg semantics may differ
1967
+ self.unsupported(
1968
+ "Transpiling dynamically-invoked IDENTIFIER() functions is unsupported"
1969
+ )
1970
+ return resolved
1971
+ self.unsupported("IDENTIFIER() with non-literal arguments is not supported")
1972
+ return self.func("IDENTIFIER", this)
1973
+
1948
1974
  def identifier_sql(self, expression: exp.Identifier) -> str:
1949
1975
  text = expression.name
1950
1976
  lower = text.lower()
@@ -2393,10 +2419,12 @@ class Generator:
2393
2419
  laterals = self.expressions(expression, key="laterals", sep="")
2394
2420
 
2395
2421
  file_format = self.sql(expression, "format")
2422
+ pattern = self.sql(expression, "pattern")
2396
2423
  if file_format:
2397
- pattern = self.sql(expression, "pattern")
2398
2424
  pattern = f", PATTERN => {pattern}" if pattern else ""
2399
2425
  file_format = f" (FILE_FORMAT => {file_format}{pattern})"
2426
+ elif pattern:
2427
+ file_format = f" (PATTERN => {pattern})"
2400
2428
 
2401
2429
  ordinality = expression.args.get("ordinality") or ""
2402
2430
  if ordinality:
@@ -3371,7 +3399,9 @@ class Generator:
3371
3399
  replace = f"{self.seg('REPLACE')} ({replace})" if replace else ""
3372
3400
  rename = self.expressions(expression, key="rename", flat=True)
3373
3401
  rename = f"{self.seg('RENAME')} ({rename})" if rename else ""
3374
- return f"*{except_}{replace}{rename}"
3402
+ ilike = self.sql(expression, "ilike")
3403
+ ilike = f"{self.seg('ILIKE')} {ilike}" if ilike else ""
3404
+ return f"*{ilike}{except_}{replace}{rename}"
3375
3405
 
3376
3406
  def parameter_sql(self, expression: exp.Parameter) -> str:
3377
3407
  this = self.sql(expression, "this")
@@ -3719,9 +3749,6 @@ class Generator:
3719
3749
  def jsonpath_sql(self, expression: exp.JSONPath) -> str:
3720
3750
  path = self.expressions(expression, sep="", flat=True).lstrip(".")
3721
3751
 
3722
- if expression.args.get("escape"):
3723
- path = self.escape_str(path)
3724
-
3725
3752
  if self.QUOTE_JSON_PATH:
3726
3753
  path = f"{self.dialect.QUOTE_START}{path}{self.dialect.QUOTE_END}"
3727
3754
 
@@ -3975,6 +4002,12 @@ class Generator:
3975
4002
  zone = self.sql(expression, "zone")
3976
4003
  return f"{this} AT TIME ZONE {zone} AT TIME ZONE 'UTC'"
3977
4004
 
4005
+ def fromiso8601date_sql(self, expression: exp.FromISO8601Date) -> str:
4006
+ return self.sql(exp.cast(expression.this, exp.DType.DATE))
4007
+
4008
+ def fromiso8601timestamp_sql(self, expression: exp.FromISO8601Timestamp) -> str:
4009
+ return self.sql(exp.cast(expression.this, exp.DType.TIMESTAMPTZ))
4010
+
3978
4011
  def add_sql(self, expression: exp.Add) -> str:
3979
4012
  return self.binary(expression, "+")
3980
4013
 
@@ -4054,6 +4087,14 @@ class Generator:
4054
4087
  def strtotime_sql(self, expression: exp.StrToTime) -> str:
4055
4088
  return self.func("STR_TO_TIME", expression.this, expression.args.get("format"))
4056
4089
 
4090
+ def parsedatetime_sql(self, expression: exp.ParseDatetime) -> str:
4091
+ return self.func(
4092
+ "PARSE_DATETIME",
4093
+ expression.this,
4094
+ expression.args.get("format"),
4095
+ expression.args.get("zone"),
4096
+ )
4097
+
4057
4098
  def currentdate_sql(self, expression: exp.CurrentDate) -> str:
4058
4099
  zone = self.sql(expression, "this")
4059
4100
  return f"CURRENT_DATE({zone})" if zone else "CURRENT_DATE"
@@ -5228,10 +5269,20 @@ class Generator:
5228
5269
  this = self.json_path_part(this)
5229
5270
  return f".{this}" if this else ""
5230
5271
 
5231
- if self.SAFE_JSON_PATH_KEY_RE.match(this):
5272
+ quoted = expression.args.get("quoted")
5273
+ if not (
5274
+ quoted and self.JSON_PATH_KEY_QUOTED_FORCES_BRACKETS
5275
+ ) and self.SAFE_JSON_PATH_KEY_RE.match(this):
5232
5276
  return f".{this}"
5233
5277
 
5234
5278
  this = self.json_path_part(this)
5279
+
5280
+ if quoted and self.QUOTE_JSON_PATH:
5281
+ # The whole path is rendered as a single quoted string literal, so the bracketed key
5282
+ # (which may itself contain backslash-escaped quotes, e.g. ["x \"y\"z"]) must be
5283
+ # escaped again for the outer string literal (-> ["x \\"y\\"z"]).
5284
+ this = self.escape_str(this)
5285
+
5235
5286
  return (
5236
5287
  f"[{this}]"
5237
5288
  if self._quote_json_path_key_using_brackets and self.JSON_PATH_BRACKETED_KEY_SUPPORTED
@@ -280,6 +280,7 @@ class ClickHouseGenerator(generator.Generator):
280
280
  exp.ArrayConcat: rename_func("arrayConcat"),
281
281
  exp.ArrayContains: rename_func("has"),
282
282
  exp.ArrayFilter: lambda self, e: self.func("arrayFilter", e.expression, e.this),
283
+ exp.Transform: lambda self, e: self.func("arrayMap", e.expression, e.this),
283
284
  exp.ArrayRemove: remove_from_array_using_filter,
284
285
  exp.ArrayReverse: rename_func("arrayReverse"),
285
286
  exp.ArraySlice: rename_func("arraySlice"),
@@ -377,7 +378,9 @@ class ClickHouseGenerator(generator.Generator):
377
378
  exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")(
378
379
  rename_func("editDistance")
379
380
  ),
380
- exp.ParseDatetime: rename_func("parseDateTime"),
381
+ exp.ParseDatetime: lambda self, e: self.func(
382
+ "parseDateTime", e.this, e.args.get("format"), e.args.get("zone")
383
+ ),
381
384
  }
382
385
 
383
386
  PROPERTIES_LOCATION = {
@@ -15,6 +15,7 @@ class DatabricksGenerator(SparkGenerator):
15
15
  COPY_PARAMS_ARE_WRAPPED = False
16
16
  COPY_PARAMS_EQ_REQUIRED = True
17
17
  JSON_PATH_SINGLE_QUOTE_ESCAPE = False
18
+ JSON_PATH_KEY_QUOTED_FORCES_BRACKETS = True
18
19
  SAFE_JSON_PATH_KEY_RE = exp.SAFE_IDENTIFIER_RE
19
20
  QUOTE_JSON_PATH = False
20
21
  PARSE_JSON_NAME: str | None = "PARSE_JSON"