sqlglot 27.6.0__tar.gz → 27.8.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 (227) hide show
  1. {sqlglot-27.6.0 → sqlglot-27.8.0}/CHANGELOG.md +156 -0
  2. {sqlglot-27.6.0 → sqlglot-27.8.0}/PKG-INFO +2 -2
  3. {sqlglot-27.6.0 → sqlglot-27.8.0}/README.md +1 -1
  4. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/_version.py +16 -3
  5. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/bigquery.py +57 -8
  6. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/clickhouse.py +27 -8
  7. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/databricks.py +5 -1
  8. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/dialect.py +82 -25
  9. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/doris.py +43 -2
  10. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/dremio.py +53 -11
  11. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/duckdb.py +39 -43
  12. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/exasol.py +30 -29
  13. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/mysql.py +0 -15
  14. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/presto.py +0 -2
  15. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/singlestore.py +121 -1
  16. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/snowflake.py +1 -1
  17. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/spark.py +7 -0
  18. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/teradata.py +58 -0
  19. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/trino.py +1 -0
  20. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/expressions.py +86 -4
  21. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/generator.py +27 -3
  22. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/jsonpath.py +10 -3
  23. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/annotate_types.py +4 -1
  24. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/merge_subqueries.py +4 -0
  25. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/qualify_tables.py +0 -8
  26. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/parser.py +44 -6
  27. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot.egg-info/PKG-INFO +2 -2
  28. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_bigquery.py +27 -23
  29. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_clickhouse.py +8 -0
  30. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_databricks.py +13 -1
  31. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_dialect.py +272 -0
  32. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_doris.py +94 -1
  33. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_dremio.py +40 -6
  34. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_duckdb.py +16 -0
  35. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_exasol.py +29 -22
  36. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_presto.py +0 -1
  37. sqlglot-27.8.0/tests/dialects/test_singlestore.py +195 -0
  38. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_snowflake.py +40 -2
  39. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_teradata.py +35 -0
  40. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_trino.py +16 -0
  41. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_tsql.py +7 -0
  42. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/annotate_functions.sql +150 -0
  43. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/merge_subqueries.sql +9 -2
  44. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/qualify_columns.sql +15 -2
  45. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_optimizer.py +2 -1
  46. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_parser.py +1 -0
  47. sqlglot-27.6.0/tests/dialects/test_singlestore.py +0 -75
  48. {sqlglot-27.6.0 → sqlglot-27.8.0}/.gitignore +0 -0
  49. {sqlglot-27.6.0 → sqlglot-27.8.0}/.gitpod.yml +0 -0
  50. {sqlglot-27.6.0 → sqlglot-27.8.0}/.pre-commit-config.yaml +0 -0
  51. {sqlglot-27.6.0 → sqlglot-27.8.0}/CONTRIBUTING.md +0 -0
  52. {sqlglot-27.6.0 → sqlglot-27.8.0}/LICENSE +0 -0
  53. {sqlglot-27.6.0 → sqlglot-27.8.0}/MANIFEST.in +0 -0
  54. {sqlglot-27.6.0 → sqlglot-27.8.0}/Makefile +0 -0
  55. {sqlglot-27.6.0 → sqlglot-27.8.0}/pyproject.toml +0 -0
  56. {sqlglot-27.6.0 → sqlglot-27.8.0}/setup.cfg +0 -0
  57. {sqlglot-27.6.0 → sqlglot-27.8.0}/setup.py +0 -0
  58. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/__init__.py +0 -0
  59. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/__main__.py +0 -0
  60. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/_typing.py +0 -0
  61. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/__init__.py +0 -0
  62. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/athena.py +0 -0
  63. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/drill.py +0 -0
  64. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/druid.py +0 -0
  65. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/dune.py +0 -0
  66. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/fabric.py +0 -0
  67. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/hive.py +0 -0
  68. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/materialize.py +0 -0
  69. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/oracle.py +0 -0
  70. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/postgres.py +0 -0
  71. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/prql.py +0 -0
  72. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/redshift.py +0 -0
  73. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/risingwave.py +0 -0
  74. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/spark2.py +0 -0
  75. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/sqlite.py +0 -0
  76. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/starrocks.py +0 -0
  77. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/tableau.py +0 -0
  78. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/dialects/tsql.py +0 -0
  79. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/diff.py +0 -0
  80. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/errors.py +0 -0
  81. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/executor/__init__.py +0 -0
  82. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/executor/context.py +0 -0
  83. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/executor/env.py +0 -0
  84. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/executor/python.py +0 -0
  85. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/executor/table.py +0 -0
  86. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/helper.py +0 -0
  87. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/lineage.py +0 -0
  88. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/__init__.py +0 -0
  89. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/canonicalize.py +0 -0
  90. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
  91. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
  92. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
  93. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  94. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/normalize.py +0 -0
  95. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  96. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/optimize_joins.py +0 -0
  97. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/optimizer.py +0 -0
  98. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
  99. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
  100. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/qualify.py +0 -0
  101. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/qualify_columns.py +0 -0
  102. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/scope.py +0 -0
  103. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/simplify.py +0 -0
  104. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/optimizer/unnest_subqueries.py +0 -0
  105. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/planner.py +0 -0
  106. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/py.typed +0 -0
  107. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/schema.py +0 -0
  108. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/serde.py +0 -0
  109. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/time.py +0 -0
  110. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/tokens.py +0 -0
  111. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/transforms.py +0 -0
  112. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot/trie.py +0 -0
  113. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot.egg-info/SOURCES.txt +0 -0
  114. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot.egg-info/dependency_links.txt +0 -0
  115. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot.egg-info/requires.txt +0 -0
  116. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot.egg-info/top_level.txt +0 -0
  117. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglot.png +0 -0
  118. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglotrs/Cargo.lock +0 -0
  119. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglotrs/Cargo.toml +0 -0
  120. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglotrs/benches/dialect_settings.json +0 -0
  121. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglotrs/benches/long.rs +0 -0
  122. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglotrs/benches/token_type_settings.json +0 -0
  123. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglotrs/benches/tokenizer_dialect_settings.json +0 -0
  124. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglotrs/benches/tokenizer_settings.json +0 -0
  125. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglotrs/pyproject.toml +0 -0
  126. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglotrs/src/lib.rs +0 -0
  127. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglotrs/src/settings.rs +0 -0
  128. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglotrs/src/token.rs +0 -0
  129. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglotrs/src/tokenizer.rs +0 -0
  130. {sqlglot-27.6.0 → sqlglot-27.8.0}/sqlglotrs/src/trie.rs +0 -0
  131. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/__init__.py +0 -0
  132. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/__init__.py +0 -0
  133. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_athena.py +0 -0
  134. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_drill.py +0 -0
  135. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_druid.py +0 -0
  136. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_dune.py +0 -0
  137. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_fabric.py +0 -0
  138. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_hive.py +0 -0
  139. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_materialize.py +0 -0
  140. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_mysql.py +0 -0
  141. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_oracle.py +0 -0
  142. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_pipe_syntax.py +0 -0
  143. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_postgres.py +0 -0
  144. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_prql.py +0 -0
  145. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_redshift.py +0 -0
  146. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_risingwave.py +0 -0
  147. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_spark.py +0 -0
  148. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_sqlite.py +0 -0
  149. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_starrocks.py +0 -0
  150. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/dialects/test_tableau.py +0 -0
  151. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/identity.sql +0 -0
  152. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/jsonpath/LICENSE +0 -0
  153. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/jsonpath/cts.json +0 -0
  154. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
  155. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
  156. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
  157. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
  158. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
  159. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
  160. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/normalize.sql +0 -0
  161. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
  162. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
  163. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/optimizer.sql +0 -0
  164. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
  165. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
  166. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
  167. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
  168. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
  169. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
  170. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
  171. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
  172. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/simplify.sql +0 -0
  173. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
  174. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
  175. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
  176. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
  177. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
  178. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
  179. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
  180. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
  181. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
  182. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
  183. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
  184. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
  185. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
  186. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
  187. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
  188. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
  189. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
  190. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
  191. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
  192. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
  193. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
  194. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
  195. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
  196. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
  197. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
  198. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
  199. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
  200. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
  201. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
  202. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
  203. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
  204. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
  205. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
  206. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
  207. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
  208. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/partial.sql +0 -0
  209. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/fixtures/pretty.sql +0 -0
  210. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/gen_fixtures.py +0 -0
  211. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/helpers.py +0 -0
  212. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_build.py +0 -0
  213. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_dialect_imports.py +0 -0
  214. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_diff.py +0 -0
  215. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_docs.py +0 -0
  216. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_executor.py +0 -0
  217. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_expressions.py +0 -0
  218. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_generator.py +0 -0
  219. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_helper.py +0 -0
  220. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_jsonpath.py +0 -0
  221. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_lineage.py +0 -0
  222. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_schema.py +0 -0
  223. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_serde.py +0 -0
  224. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_time.py +0 -0
  225. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_tokens.py +0 -0
  226. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_transforms.py +0 -0
  227. {sqlglot-27.6.0 → sqlglot-27.8.0}/tests/test_transpile.py +0 -0
@@ -1,6 +1,160 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ ## [v27.7.0] - 2025-08-13
5
+ ### :boom: BREAKING CHANGES
6
+ - due to [`938f4b6`](https://github.com/tobymao/sqlglot/commit/938f4b6ebc1c0d26bd3c1400883978c79a435189) - annotate type for LAST_DAY *(PR [#5528](https://github.com/tobymao/sqlglot/pull/5528) by [@geooo109](https://github.com/geooo109))*:
7
+
8
+ annotate type for LAST_DAY (#5528)
9
+
10
+ - due to [`7d12dac`](https://github.com/tobymao/sqlglot/commit/7d12dac613ba5119334408f2c52cb270067156d9) - annotate type for bigquery GENERATE_TIMESTAMP_ARRAY *(PR [#5529](https://github.com/tobymao/sqlglot/pull/5529) by [@geooo109](https://github.com/geooo109))*:
11
+
12
+ annotate type for bigquery GENERATE_TIMESTAMP_ARRAY (#5529)
13
+
14
+ - due to [`d50ebe2`](https://github.com/tobymao/sqlglot/commit/d50ebe286dd8e2836b9eb2a3406f15976db3aa05) - annotate type for bigquery TIME_TRUNC *(PR [#5530](https://github.com/tobymao/sqlglot/pull/5530) by [@geooo109](https://github.com/geooo109))*:
15
+
16
+ annotate type for bigquery TIME_TRUNC (#5530)
17
+
18
+ - due to [`29748be`](https://github.com/tobymao/sqlglot/commit/29748be7dfc10edc9f29665c98327883dd25c13d) - annotate type for bigquery TIME *(PR [#5531](https://github.com/tobymao/sqlglot/pull/5531) by [@geooo109](https://github.com/geooo109))*:
19
+
20
+ annotate type for bigquery TIME (#5531)
21
+
22
+ - due to [`7003b3f`](https://github.com/tobymao/sqlglot/commit/7003b3fa39cd455e3643066364696708d1ac4f38) - parse and annotate type for bigquery DATE_FROM_UNIX_DATE *(PR [#5532](https://github.com/tobymao/sqlglot/pull/5532) by [@geooo109](https://github.com/geooo109))*:
23
+
24
+ parse and annotate type for bigquery DATE_FROM_UNIX_DATE (#5532)
25
+
26
+ - due to [`a276ca6`](https://github.com/tobymao/sqlglot/commit/a276ca6fd5f9d47fa8c90fcfa19f9864e7a28f8f) - parse and annotate type for bigquery JUSTIFY funcs *(PR [#5534](https://github.com/tobymao/sqlglot/pull/5534) by [@geooo109](https://github.com/geooo109))*:
27
+
28
+ parse and annotate type for bigquery JUSTIFY funcs (#5534)
29
+
30
+ - due to [`374178e`](https://github.com/tobymao/sqlglot/commit/374178e22fe8d2d2275b65fe08e27ef66c611220) - parse and annotate type for bigquery UNIX_MICROS and UNIX_MILLIS *(PR [#5535](https://github.com/tobymao/sqlglot/pull/5535) by [@geooo109](https://github.com/geooo109))*:
31
+
32
+ parse and annotate type for bigquery UNIX_MICROS and UNIX_MILLIS (#5535)
33
+
34
+ - due to [`1d8d1ab`](https://github.com/tobymao/sqlglot/commit/1d8d1abe459053a135a46525d0a13bb861220927) - annotate type for bigquery DATE_TRUNC *(PR [#5540](https://github.com/tobymao/sqlglot/pull/5540) by [@geooo109](https://github.com/geooo109))*:
35
+
36
+ annotate type for bigquery DATE_TRUNC (#5540)
37
+
38
+ - due to [`306ba65`](https://github.com/tobymao/sqlglot/commit/306ba6531839ea2823f5165de7bde01d17560845) - annotate type for bigquery TIMESTAMP_TRUNC *(PR [#5541](https://github.com/tobymao/sqlglot/pull/5541) by [@geooo109](https://github.com/geooo109))*:
39
+
40
+ annotate type for bigquery TIMESTAMP_TRUNC (#5541)
41
+
42
+ - due to [`d799c5a`](https://github.com/tobymao/sqlglot/commit/d799c5af23010a67c29edb6d45a40fb24903e1a3) - preserve projection names when merging subqueries *(commit by [@snovik75](https://github.com/snovik75))*:
43
+
44
+ preserve projection names when merging subqueries
45
+
46
+ - due to [`8130bd4`](https://github.com/tobymao/sqlglot/commit/8130bd40815803a6781ee8f20fccd30987516192) - WEEKDAY of WEEK as VAR *(PR [#5552](https://github.com/tobymao/sqlglot/pull/5552) by [@geooo109](https://github.com/geooo109))*:
47
+
48
+ WEEKDAY of WEEK as VAR (#5552)
49
+
50
+ - due to [`f3ffe19`](https://github.com/tobymao/sqlglot/commit/f3ffe19ec01533c5f27b9d3a7b6704b83c005118) - annotate type for bigquery format_time *(PR [#5559](https://github.com/tobymao/sqlglot/pull/5559) by [@geooo109](https://github.com/geooo109))*:
51
+
52
+ annotate type for bigquery format_time (#5559)
53
+
54
+ - due to [`6872b43`](https://github.com/tobymao/sqlglot/commit/6872b43ba17a39137172fd2fa9f0d059ce595ef9) - use dialect in DataType.build fixes [#5560](https://github.com/tobymao/sqlglot/pull/5560) *(commit by [@georgesittas](https://github.com/georgesittas))*:
55
+
56
+ use dialect in DataType.build fixes #5560
57
+
58
+ - due to [`3ab3690`](https://github.com/tobymao/sqlglot/commit/3ab369096313b418699b7942b1c513c0c66a5331) - parse and annotate type for bigquery PARSE_DATETIME *(PR [#5558](https://github.com/tobymao/sqlglot/pull/5558) by [@geooo109](https://github.com/geooo109))*:
59
+
60
+ parse and annotate type for bigquery PARSE_DATETIME (#5558)
61
+
62
+ - due to [`e5da951`](https://github.com/tobymao/sqlglot/commit/e5da951542eb55691bc43fbbfbec4a30100de038) - parse and annotate type for bigquery PARSE_TIME *(PR [#5561](https://github.com/tobymao/sqlglot/pull/5561) by [@geooo109](https://github.com/geooo109))*:
63
+
64
+ parse and annotate type for bigquery PARSE_TIME (#5561)
65
+
66
+ - due to [`798e213`](https://github.com/tobymao/sqlglot/commit/798e213fd10c3b61afbd8cef621546de65fa6f26) - improve transpilability of ANY_VALUE closes [#5563](https://github.com/tobymao/sqlglot/pull/5563) *(commit by [@georgesittas](https://github.com/georgesittas))*:
67
+
68
+ improve transpilability of ANY_VALUE closes #5563
69
+
70
+ - due to [`8c0cb76`](https://github.com/tobymao/sqlglot/commit/8c0cb764fd825062fb7334032b8eeffbc39627d5) - more robust CREATE SEQUENCE *(PR [#5566](https://github.com/tobymao/sqlglot/pull/5566) by [@geooo109](https://github.com/geooo109))*:
71
+
72
+ more robust CREATE SEQUENCE (#5566)
73
+
74
+ - due to [`c7041c7`](https://github.com/tobymao/sqlglot/commit/c7041c71250b17192c2f25fb8f33407324d332c2) - parse and annotate type for bigquery BYTE_LENGHT *(PR [#5568](https://github.com/tobymao/sqlglot/pull/5568) by [@geooo109](https://github.com/geooo109))*:
75
+
76
+ parse and annotate type for bigquery BYTE_LENGHT (#5568)
77
+
78
+ - due to [`a6c61c3`](https://github.com/tobymao/sqlglot/commit/a6c61c34f1e168c97dd5c2b8ec071372ba593992) - parse and annotate type for bigquery CODE_POINTS_TO_STRING *(PR [#5569](https://github.com/tobymao/sqlglot/pull/5569) by [@geooo109](https://github.com/geooo109))*:
79
+
80
+ parse and annotate type for bigquery CODE_POINTS_TO_STRING (#5569)
81
+
82
+ - due to [`51e0335`](https://github.com/tobymao/sqlglot/commit/51e0335377fe2bc2e2a94a623475791e9dd19fb9) - parse and annotate type for bigquery REVERSE *(PR [#5571](https://github.com/tobymao/sqlglot/pull/5571) by [@geooo109](https://github.com/geooo109))*:
83
+
84
+ parse and annotate type for bigquery REVERSE (#5571)
85
+
86
+
87
+ ### :sparkles: New Features
88
+ - [`1fb90db`](https://github.com/tobymao/sqlglot/commit/1fb90db52b59e6e3a40597c6f611d0476b72025b) - **teradata**: Add support for Teradata set query band expression *(PR [#5519](https://github.com/tobymao/sqlglot/pull/5519) by [@treff7es](https://github.com/treff7es))*
89
+ - [`a49baaf`](https://github.com/tobymao/sqlglot/commit/a49baaf717cb41abb25ca51ae5adddc8473baa8b) - **doris**: Override table_sql to avoid AS keyword in UPDATE and DELETE statements *(PR [#5517](https://github.com/tobymao/sqlglot/pull/5517) by [@peterylh](https://github.com/peterylh))*
90
+ - [`75fd6d2`](https://github.com/tobymao/sqlglot/commit/75fd6d21fb7bc8399432e73d10b4837ae62d2ab5) - **exasol**: Add support for date difference functions in Exasol dialect *(PR [#5510](https://github.com/tobymao/sqlglot/pull/5510) by [@nnamdi16](https://github.com/nnamdi16))*
91
+ - [`2a91bb4`](https://github.com/tobymao/sqlglot/commit/2a91bb4f17c7569a5b409cc07e970e5d68235149) - **teradata**: Add support for Teradata locking select *(PR [#5524](https://github.com/tobymao/sqlglot/pull/5524) by [@treff7es](https://github.com/treff7es))*
92
+ - [`938f4b6`](https://github.com/tobymao/sqlglot/commit/938f4b6ebc1c0d26bd3c1400883978c79a435189) - **optimizer**: annotate type for LAST_DAY *(PR [#5528](https://github.com/tobymao/sqlglot/pull/5528) by [@geooo109](https://github.com/geooo109))*
93
+ - [`7d12dac`](https://github.com/tobymao/sqlglot/commit/7d12dac613ba5119334408f2c52cb270067156d9) - **optimizer**: annotate type for bigquery GENERATE_TIMESTAMP_ARRAY *(PR [#5529](https://github.com/tobymao/sqlglot/pull/5529) by [@geooo109](https://github.com/geooo109))*
94
+ - [`d50ebe2`](https://github.com/tobymao/sqlglot/commit/d50ebe286dd8e2836b9eb2a3406f15976db3aa05) - **optimizer**: annotate type for bigquery TIME_TRUNC *(PR [#5530](https://github.com/tobymao/sqlglot/pull/5530) by [@geooo109](https://github.com/geooo109))*
95
+ - [`29748be`](https://github.com/tobymao/sqlglot/commit/29748be7dfc10edc9f29665c98327883dd25c13d) - **optimizer**: annotate type for bigquery TIME *(PR [#5531](https://github.com/tobymao/sqlglot/pull/5531) by [@geooo109](https://github.com/geooo109))*
96
+ - [`7003b3f`](https://github.com/tobymao/sqlglot/commit/7003b3fa39cd455e3643066364696708d1ac4f38) - **optimizer**: parse and annotate type for bigquery DATE_FROM_UNIX_DATE *(PR [#5532](https://github.com/tobymao/sqlglot/pull/5532) by [@geooo109](https://github.com/geooo109))*
97
+ - [`a276ca6`](https://github.com/tobymao/sqlglot/commit/a276ca6fd5f9d47fa8c90fcfa19f9864e7a28f8f) - **optimizer**: parse and annotate type for bigquery JUSTIFY funcs *(PR [#5534](https://github.com/tobymao/sqlglot/pull/5534) by [@geooo109](https://github.com/geooo109))*
98
+ - [`374178e`](https://github.com/tobymao/sqlglot/commit/374178e22fe8d2d2275b65fe08e27ef66c611220) - **optimizer**: parse and annotate type for bigquery UNIX_MICROS and UNIX_MILLIS *(PR [#5535](https://github.com/tobymao/sqlglot/pull/5535) by [@geooo109](https://github.com/geooo109))*
99
+ - [`1d8d1ab`](https://github.com/tobymao/sqlglot/commit/1d8d1abe459053a135a46525d0a13bb861220927) - **optimizer**: annotate type for bigquery DATE_TRUNC *(PR [#5540](https://github.com/tobymao/sqlglot/pull/5540) by [@geooo109](https://github.com/geooo109))*
100
+ - [`306ba65`](https://github.com/tobymao/sqlglot/commit/306ba6531839ea2823f5165de7bde01d17560845) - **optimizer**: annotate type for bigquery TIMESTAMP_TRUNC *(PR [#5541](https://github.com/tobymao/sqlglot/pull/5541) by [@geooo109](https://github.com/geooo109))*
101
+ - [`6a68cca`](https://github.com/tobymao/sqlglot/commit/6a68cca97ad4bdd75c544ada0a5af0fa92ec4664) - **dremio**: support lowercase `TIME_MAPPING` formats *(PR [#5556](https://github.com/tobymao/sqlglot/pull/5556) by [@jasonthomassql](https://github.com/jasonthomassql))*
102
+ - [`f3ffe19`](https://github.com/tobymao/sqlglot/commit/f3ffe19ec01533c5f27b9d3a7b6704b83c005118) - **optimizer**: annotate type for bigquery format_time *(PR [#5559](https://github.com/tobymao/sqlglot/pull/5559) by [@geooo109](https://github.com/geooo109))*
103
+ - [`3ab3690`](https://github.com/tobymao/sqlglot/commit/3ab369096313b418699b7942b1c513c0c66a5331) - **optimizer**: parse and annotate type for bigquery PARSE_DATETIME *(PR [#5558](https://github.com/tobymao/sqlglot/pull/5558) by [@geooo109](https://github.com/geooo109))*
104
+ - [`e5da951`](https://github.com/tobymao/sqlglot/commit/e5da951542eb55691bc43fbbfbec4a30100de038) - **optimizer**: parse and annotate type for bigquery PARSE_TIME *(PR [#5561](https://github.com/tobymao/sqlglot/pull/5561) by [@geooo109](https://github.com/geooo109))*
105
+ - [`902a0cd`](https://github.com/tobymao/sqlglot/commit/902a0cdfe46f693aa55612d45a2de2def21f0b8c) - **singlestore**: Added parsing/generation of UNIXTIME functions *(PR [#5562](https://github.com/tobymao/sqlglot/pull/5562) by [@AdalbertMemSQL](https://github.com/AdalbertMemSQL))*
106
+ - [`798e213`](https://github.com/tobymao/sqlglot/commit/798e213fd10c3b61afbd8cef621546de65fa6f26) - **duckdb**: improve transpilability of ANY_VALUE closes [#5563](https://github.com/tobymao/sqlglot/pull/5563) *(commit by [@georgesittas](https://github.com/georgesittas))*
107
+ - [`c7041c7`](https://github.com/tobymao/sqlglot/commit/c7041c71250b17192c2f25fb8f33407324d332c2) - **optimizer**: parse and annotate type for bigquery BYTE_LENGHT *(PR [#5568](https://github.com/tobymao/sqlglot/pull/5568) by [@geooo109](https://github.com/geooo109))*
108
+ - [`a6c61c3`](https://github.com/tobymao/sqlglot/commit/a6c61c34f1e168c97dd5c2b8ec071372ba593992) - **optimizer**: parse and annotate type for bigquery CODE_POINTS_TO_STRING *(PR [#5569](https://github.com/tobymao/sqlglot/pull/5569) by [@geooo109](https://github.com/geooo109))*
109
+
110
+ ### :bug: Bug Fixes
111
+ - [`9020684`](https://github.com/tobymao/sqlglot/commit/9020684a7e984a10fa4775339596ac5a0d6a6d93) - nested natural join performance closes [#5514](https://github.com/tobymao/sqlglot/pull/5514) *(PR [#5515](https://github.com/tobymao/sqlglot/pull/5515) by [@tobymao](https://github.com/tobymao))*
112
+ - [`394870a`](https://github.com/tobymao/sqlglot/commit/394870a7ee9bb3bc814b7c3847193687f06b432b) - **duckdb**: transpile ADD_MONTHS *(PR [#5523](https://github.com/tobymao/sqlglot/pull/5523) by [@geooo109](https://github.com/geooo109))*
113
+ - :arrow_lower_right: *fixes issue [#5505](https://github.com/tobymao/sqlglot/issues/5505) opened by [@kyle-cheung](https://github.com/kyle-cheung)*
114
+ - [`249692c`](https://github.com/tobymao/sqlglot/commit/249692c67450a1fe3775e1f35b6f62fdb0a62e1a) - **duckdb**: put guard in AddMonths generator before annotating it *(commit by [@georgesittas](https://github.com/georgesittas))*
115
+ - [`d799c5a`](https://github.com/tobymao/sqlglot/commit/d799c5af23010a67c29edb6d45a40fb24903e1a3) - **optimizer**: preserve projection names when merging subqueries *(commit by [@snovik75](https://github.com/snovik75))*
116
+ - [`8130bd4`](https://github.com/tobymao/sqlglot/commit/8130bd40815803a6781ee8f20fccd30987516192) - **parser**: WEEKDAY of WEEK as VAR *(PR [#5552](https://github.com/tobymao/sqlglot/pull/5552) by [@geooo109](https://github.com/geooo109))*
117
+ - :arrow_lower_right: *fixes issue [#5547](https://github.com/tobymao/sqlglot/issues/5547) opened by [@rloredo](https://github.com/rloredo)*
118
+ - [`4e1373f`](https://github.com/tobymao/sqlglot/commit/4e1373f301cbea3cb5762fc1430b65deae3f9d04) - **doris**: Rename Table *(PR [#5549](https://github.com/tobymao/sqlglot/pull/5549) by [@xinge-ji](https://github.com/xinge-ji))*
119
+ - [`16f544d`](https://github.com/tobymao/sqlglot/commit/16f544dc25d5d61277d32f02e4be18c10d16cf9f) - **doris**: fix DATE_TRUNC and partition by *(PR [#5553](https://github.com/tobymao/sqlglot/pull/5553) by [@xinge-ji](https://github.com/xinge-ji))*
120
+ - [`6295414`](https://github.com/tobymao/sqlglot/commit/6295414fb41401f92993e661b880a0727e74c087) - convert unit to Var instead of choosing default in `unit_to_var` *(commit by [@georgesittas](https://github.com/georgesittas))*
121
+ - [`6872b43`](https://github.com/tobymao/sqlglot/commit/6872b43ba17a39137172fd2fa9f0d059ce595ef9) - **parser**: use dialect in DataType.build fixes [#5560](https://github.com/tobymao/sqlglot/pull/5560) *(commit by [@georgesittas](https://github.com/georgesittas))*
122
+ - [`6f354d9`](https://github.com/tobymao/sqlglot/commit/6f354d958fb9ca9242b7fc1d2da86af74d57fedc) - **clickhouse**: add ROWS keyword in OFFSET followed by FETCH fixes [#5564](https://github.com/tobymao/sqlglot/pull/5564) *(commit by [@georgesittas](https://github.com/georgesittas))*
123
+ - [`8c0cb76`](https://github.com/tobymao/sqlglot/commit/8c0cb764fd825062fb7334032b8eeffbc39627d5) - **parser**: more robust CREATE SEQUENCE *(PR [#5566](https://github.com/tobymao/sqlglot/pull/5566) by [@geooo109](https://github.com/geooo109))*
124
+ - :arrow_lower_right: *fixes issue [#5537](https://github.com/tobymao/sqlglot/issues/5537) opened by [@tekumara](https://github.com/tekumara)*
125
+ - [`7e9df88`](https://github.com/tobymao/sqlglot/commit/7e9df880bc118d0dbb2dbd6344f805f79af2fe5e) - **doris**: CURRENT_DATE *(PR [#5567](https://github.com/tobymao/sqlglot/pull/5567) by [@xinge-ji](https://github.com/xinge-ji))*
126
+ - [`51e0335`](https://github.com/tobymao/sqlglot/commit/51e0335377fe2bc2e2a94a623475791e9dd19fb9) - **optimizer**: parse and annotate type for bigquery REVERSE *(PR [#5571](https://github.com/tobymao/sqlglot/pull/5571) by [@geooo109](https://github.com/geooo109))*
127
+
128
+ ### :wrench: Chores
129
+ - [`720f634`](https://github.com/tobymao/sqlglot/commit/720f6343f6144e8986ec6b7e50419c3d7a331f0a) - Fix style on main, refactor exasol tests *(PR [#5527](https://github.com/tobymao/sqlglot/pull/5527) by [@VaggelisD](https://github.com/VaggelisD))*
130
+ - [`5653501`](https://github.com/tobymao/sqlglot/commit/5653501606f041282b6315c3efa33b9a3baf8d98) - Refactor PR 5517 *(PR [#5526](https://github.com/tobymao/sqlglot/pull/5526) by [@VaggelisD](https://github.com/VaggelisD))*
131
+ - [`d15dfe3`](https://github.com/tobymao/sqlglot/commit/d15dfe3f0f4444e4999ad65051b2474e62f422b3) - build type using dialect for bigquery *(PR [#5539](https://github.com/tobymao/sqlglot/pull/5539) by [@geooo109](https://github.com/geooo109))*
132
+
133
+
134
+ ## [v27.6.0] - 2025-08-01
135
+ ### :boom: BREAKING CHANGES
136
+ - due to [`6b691b3`](https://github.com/tobymao/sqlglot/commit/6b691b33c3528c0377bd8822a3df90de869c6cb1) - Parse and transpile GET(...) extract function *(PR [#5500](https://github.com/tobymao/sqlglot/pull/5500) by [@VaggelisD](https://github.com/VaggelisD))*:
137
+
138
+ Parse and transpile GET(...) extract function (#5500)
139
+
140
+ - due to [`964a275`](https://github.com/tobymao/sqlglot/commit/964a275b42314380de3b301ada9f9756602729f7) - Make `UNION` column qualification recursive *(PR [#5508](https://github.com/tobymao/sqlglot/pull/5508) by [@VaggelisD](https://github.com/VaggelisD))*:
141
+
142
+ Make `UNION` column qualification recursive (#5508)
143
+
144
+
145
+ ### :sparkles: New Features
146
+ - [`6b691b3`](https://github.com/tobymao/sqlglot/commit/6b691b33c3528c0377bd8822a3df90de869c6cb1) - **snowflake**: Parse and transpile GET(...) extract function *(PR [#5500](https://github.com/tobymao/sqlglot/pull/5500) by [@VaggelisD](https://github.com/VaggelisD))*
147
+ - :arrow_lower_right: *addresses issue [#5495](https://github.com/tobymao/sqlglot/issues/5495) opened by [@kyle-cheung](https://github.com/kyle-cheung)*
148
+ - [`a2a2f0f`](https://github.com/tobymao/sqlglot/commit/a2a2f0fe910228651c5c39beebcc02172a0b7e94) - **exasol**: Add support for IF, NULLIFZERO, and ZEROIFNULL functions *(PR [#5502](https://github.com/tobymao/sqlglot/pull/5502) by [@nnamdi16](https://github.com/nnamdi16))*
149
+ - [`2d8ce58`](https://github.com/tobymao/sqlglot/commit/2d8ce587c75f21b188ec4c201936eedac3b051e8) - **singlestore**: Added cast operator *(PR [#5504](https://github.com/tobymao/sqlglot/pull/5504) by [@AdalbertMemSQL](https://github.com/AdalbertMemSQL))*
150
+ - [`6256348`](https://github.com/tobymao/sqlglot/commit/6256348a28b72ae9052d4244736846af209410b0) - **exasol**: add support for ADD_DAYS function in exasol dialect *(PR [#5507](https://github.com/tobymao/sqlglot/pull/5507) by [@nnamdi16](https://github.com/nnamdi16))*
151
+ - [`2f40fc5`](https://github.com/tobymao/sqlglot/commit/2f40fc578a840c9276a4c3b91351fb8d95c837fc) - add more pseudocols to bq which are not expanded by star *(PR [#5509](https://github.com/tobymao/sqlglot/pull/5509) by [@z3z1ma](https://github.com/z3z1ma))*
152
+
153
+ ### :bug: Bug Fixes
154
+ - [`3b52061`](https://github.com/tobymao/sqlglot/commit/3b520611c5a894ddea935d13aadd27c791a8a755) - **exasol**: fix TokenType.TEXT mapping in exasol dialect *(PR [#5506](https://github.com/tobymao/sqlglot/pull/5506) by [@nnamdi16](https://github.com/nnamdi16))*
155
+ - [`964a275`](https://github.com/tobymao/sqlglot/commit/964a275b42314380de3b301ada9f9756602729f7) - Make `UNION` column qualification recursive *(PR [#5508](https://github.com/tobymao/sqlglot/pull/5508) by [@VaggelisD](https://github.com/VaggelisD))*
156
+
157
+
4
158
  ## [v27.5.1] - 2025-07-30
5
159
  ### :bug: Bug Fixes
6
160
  - [`caf71d6`](https://github.com/tobymao/sqlglot/commit/caf71d687c0048d2346fddaee58b519e4f2e7945) - `between` builder should not set `symmetric` by default *(commit by [@georgesittas](https://github.com/georgesittas))*
@@ -6379,3 +6533,5 @@ Changelog
6379
6533
  [v27.4.1]: https://github.com/tobymao/sqlglot/compare/v27.4.0...v27.4.1
6380
6534
  [v27.5.0]: https://github.com/tobymao/sqlglot/compare/v27.4.1...v27.5.0
6381
6535
  [v27.5.1]: https://github.com/tobymao/sqlglot/compare/v27.5.0...v27.5.1
6536
+ [v27.6.0]: https://github.com/tobymao/sqlglot/compare/v27.5.1...v27.6.0
6537
+ [v27.7.0]: https://github.com/tobymao/sqlglot/compare/v27.6.0...v27.7.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 27.6.0
3
+ Version: 27.8.0
4
4
  Summary: An easily customizable SQL parser and transpiler
5
5
  Author-email: Toby Mao <toby.mao@gmail.com>
6
6
  Project-URL: Homepage, https://sqlglot.com/
@@ -256,7 +256,7 @@ sqlglot.errors.ParseError: Expecting ). Line 1, Col: 34.
256
256
  Structured syntax errors are accessible for programmatic use:
257
257
 
258
258
  ```python
259
- import sqlglot
259
+ import sqlglot.errors
260
260
  try:
261
261
  sqlglot.transpile("SELECT foo FROM (SELECT baz FROM t")
262
262
  except sqlglot.errors.ParseError as e:
@@ -218,7 +218,7 @@ sqlglot.errors.ParseError: Expecting ). Line 1, Col: 34.
218
218
  Structured syntax errors are accessible for programmatic use:
219
219
 
220
220
  ```python
221
- import sqlglot
221
+ import sqlglot.errors
222
222
  try:
223
223
  sqlglot.transpile("SELECT foo FROM (SELECT baz FROM t")
224
224
  except sqlglot.errors.ParseError as e:
@@ -1,7 +1,14 @@
1
1
  # file generated by setuptools-scm
2
2
  # don't change, don't track in version control
3
3
 
4
- __all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
5
12
 
6
13
  TYPE_CHECKING = False
7
14
  if TYPE_CHECKING:
@@ -9,13 +16,19 @@ if TYPE_CHECKING:
9
16
  from typing import Union
10
17
 
11
18
  VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
12
20
  else:
13
21
  VERSION_TUPLE = object
22
+ COMMIT_ID = object
14
23
 
15
24
  version: str
16
25
  __version__: str
17
26
  __version_tuple__: VERSION_TUPLE
18
27
  version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
19
30
 
20
- __version__ = version = '27.6.0'
21
- __version_tuple__ = version_tuple = (27, 6, 0)
31
+ __version__ = version = '27.8.0'
32
+ __version_tuple__ = version_tuple = (27, 8, 0)
33
+
34
+ __commit_id__ = commit_id = 'g093f35c20'
@@ -4,7 +4,7 @@ import logging
4
4
  import re
5
5
  import typing as t
6
6
 
7
- from sqlglot import exp, generator, parser, tokens, transforms
7
+ from sqlglot import exp, generator, jsonpath, parser, tokens, transforms
8
8
  from sqlglot._typing import E
9
9
  from sqlglot.dialects.dialect import (
10
10
  Dialect,
@@ -30,7 +30,6 @@ from sqlglot.dialects.dialect import (
30
30
  unit_to_var,
31
31
  strposition_sql,
32
32
  groupconcat_sql,
33
- space_sql,
34
33
  )
35
34
  from sqlglot.helper import seq_get, split_num_words
36
35
  from sqlglot.tokens import TokenType
@@ -474,6 +473,8 @@ class BigQuery(Dialect):
474
473
  exp.Substring,
475
474
  )
476
475
  },
476
+ exp.ArgMax: lambda self, e: self._annotate_by_args(e, "this"),
477
+ exp.ArgMin: lambda self, e: self._annotate_by_args(e, "this"),
477
478
  exp.Array: _annotate_array,
478
479
  exp.ArrayConcat: lambda self, e: self._annotate_by_args(e, "this", "expressions"),
479
480
  exp.Ascii: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BIGINT),
@@ -481,10 +482,21 @@ class BigQuery(Dialect):
481
482
  exp.BitwiseOrAgg: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BIGINT),
482
483
  exp.BitwiseXorAgg: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BIGINT),
483
484
  exp.BitwiseCountAgg: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BIGINT),
485
+ exp.ByteLength: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BIGINT),
486
+ exp.ByteString: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BINARY),
487
+ exp.CodePointsToString: lambda self, e: self._annotate_with_type(
488
+ e, exp.DataType.Type.VARCHAR
489
+ ),
484
490
  exp.Concat: _annotate_concat,
485
491
  exp.Corr: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.DOUBLE),
486
492
  exp.CovarPop: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.DOUBLE),
487
493
  exp.CovarSamp: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.DOUBLE),
494
+ exp.DateFromUnixDate: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.DATE),
495
+ exp.DateTrunc: lambda self, e: self._annotate_by_args(e, "this"),
496
+ exp.GenerateTimestampArray: lambda self, e: self._annotate_with_type(
497
+ e, exp.DataType.build("ARRAY<TIMESTAMP>", dialect="bigquery")
498
+ ),
499
+ exp.Grouping: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BIGINT),
488
500
  exp.JSONArray: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.JSON),
489
501
  exp.JSONExtractScalar: lambda self, e: self._annotate_with_type(
490
502
  e, exp.DataType.Type.VARCHAR
@@ -494,6 +506,13 @@ class BigQuery(Dialect):
494
506
  ),
495
507
  exp.JSONType: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.VARCHAR),
496
508
  exp.Lag: lambda self, e: self._annotate_by_args(e, "this", "default"),
509
+ exp.MD5Digest: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BINARY),
510
+ exp.ParseTime: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.TIME),
511
+ exp.ParseDatetime: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.DATETIME),
512
+ exp.RegexpExtractAll: lambda self, e: self._annotate_by_args(e, "this", array=True),
513
+ exp.Replace: lambda self, e: self._annotate_by_args(e, "this"),
514
+ exp.Reverse: lambda self, e: self._annotate_by_args(e, "this"),
515
+ exp.Soundex: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.VARCHAR),
497
516
  exp.SHA: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BINARY),
498
517
  exp.SHA2: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BINARY),
499
518
  exp.Sign: lambda self, e: self._annotate_by_args(e, "this"),
@@ -501,6 +520,11 @@ class BigQuery(Dialect):
501
520
  exp.TimestampFromParts: lambda self, e: self._annotate_with_type(
502
521
  e, exp.DataType.Type.DATETIME
503
522
  ),
523
+ exp.TimestampTrunc: lambda self, e: self._annotate_by_args(e, "this"),
524
+ exp.TimeFromParts: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.TIME),
525
+ exp.TsOrDsToTime: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.TIME),
526
+ exp.TimeTrunc: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.TIME),
527
+ exp.Translate: lambda self, e: self._annotate_by_args(e, "this"),
504
528
  exp.Unicode: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BIGINT),
505
529
  }
506
530
 
@@ -533,6 +557,12 @@ class BigQuery(Dialect):
533
557
 
534
558
  return super().normalize_identifier(expression)
535
559
 
560
+ class JSONPathTokenizer(jsonpath.JSONPathTokenizer):
561
+ VAR_TOKENS = {
562
+ TokenType.DASH,
563
+ TokenType.VAR,
564
+ }
565
+
536
566
  class Tokenizer(tokens.Tokenizer):
537
567
  QUOTES = ["'", '"', '"""', "'''"]
538
568
  COMMENTS = ["--", "#", ("/*", "*/")]
@@ -621,7 +651,13 @@ class BigQuery(Dialect):
621
651
  "PARSE_DATE": lambda args: build_formatted_time(exp.StrToDate, "bigquery")(
622
652
  [seq_get(args, 1), seq_get(args, 0)]
623
653
  ),
654
+ "PARSE_TIME": lambda args: build_formatted_time(exp.ParseTime, "bigquery")(
655
+ [seq_get(args, 1), seq_get(args, 0)]
656
+ ),
624
657
  "PARSE_TIMESTAMP": _build_parse_timestamp,
658
+ "PARSE_DATETIME": lambda args: build_formatted_time(exp.ParseDatetime, "bigquery")(
659
+ [seq_get(args, 1), seq_get(args, 0)]
660
+ ),
625
661
  "REGEXP_CONTAINS": exp.RegexpLike.from_arg_list,
626
662
  "REGEXP_EXTRACT": _build_regexp_extract(exp.RegexpExtract),
627
663
  "REGEXP_SUBSTR": _build_regexp_extract(exp.RegexpExtract),
@@ -652,6 +688,8 @@ class BigQuery(Dialect):
652
688
  "TO_JSON_STRING": exp.JSONFormat.from_arg_list,
653
689
  "FORMAT_DATETIME": _build_format_time(exp.TsOrDsToDatetime),
654
690
  "FORMAT_TIMESTAMP": _build_format_time(exp.TsOrDsToTimestamp),
691
+ "FORMAT_TIME": _build_format_time(exp.TsOrDsToTime),
692
+ "WEEK": lambda args: exp.WeekStart(this=exp.var(seq_get(args, 0))),
655
693
  }
656
694
 
657
695
  FUNCTION_PARSERS = {
@@ -994,6 +1032,15 @@ class BigQuery(Dialect):
994
1032
  EXCEPT_INTERSECT_SUPPORT_ALL_CLAUSE = False
995
1033
  SUPPORTS_UNIX_SECONDS = True
996
1034
 
1035
+ SAFE_JSON_PATH_KEY_RE = re.compile(r"^[_\-a-zA-Z][\-\w]*$")
1036
+
1037
+ TS_OR_DS_TYPES = (
1038
+ exp.TsOrDsToDatetime,
1039
+ exp.TsOrDsToTimestamp,
1040
+ exp.TsOrDsToTime,
1041
+ exp.TsOrDsToDate,
1042
+ )
1043
+
997
1044
  TRANSFORMS = {
998
1045
  **generator.Generator.TRANSFORMS,
999
1046
  exp.ApproxDistinct: rename_func("APPROX_COUNT_DISTINCT"),
@@ -1022,6 +1069,7 @@ class BigQuery(Dialect):
1022
1069
  exp.DateSub: date_add_interval_sql("DATE", "SUB"),
1023
1070
  exp.DatetimeAdd: date_add_interval_sql("DATETIME", "ADD"),
1024
1071
  exp.DatetimeSub: date_add_interval_sql("DATETIME", "SUB"),
1072
+ exp.DateFromUnixDate: rename_func("DATE_FROM_UNIX_DATE"),
1025
1073
  exp.FromTimeZone: lambda self, e: self.func(
1026
1074
  "DATETIME", self.func("TIMESTAMP", e.this, e.args.get("zone")), "'UTC'"
1027
1075
  ),
@@ -1059,6 +1107,10 @@ class BigQuery(Dialect):
1059
1107
  exp.RegexpLike: rename_func("REGEXP_CONTAINS"),
1060
1108
  exp.ReturnsProperty: _returnsproperty_sql,
1061
1109
  exp.Rollback: lambda *_: "ROLLBACK TRANSACTION",
1110
+ exp.ParseTime: lambda self, e: self.func("PARSE_TIME", self.format_time(e), e.this),
1111
+ exp.ParseDatetime: lambda self, e: self.func(
1112
+ "PARSE_DATETIME", self.format_time(e), e.this
1113
+ ),
1062
1114
  exp.Select: transforms.preprocess(
1063
1115
  [
1064
1116
  transforms.explode_projection_to_unnest(),
@@ -1070,7 +1122,6 @@ class BigQuery(Dialect):
1070
1122
  ),
1071
1123
  exp.SHA: rename_func("SHA1"),
1072
1124
  exp.SHA2: sha256_sql,
1073
- exp.Space: space_sql,
1074
1125
  exp.StabilityProperty: lambda self, e: (
1075
1126
  "DETERMINISTIC" if e.name == "IMMUTABLE" else "NOT DETERMINISTIC"
1076
1127
  ),
@@ -1297,14 +1348,12 @@ class BigQuery(Dialect):
1297
1348
  func_name = "FORMAT_DATETIME"
1298
1349
  elif isinstance(this, exp.TsOrDsToTimestamp):
1299
1350
  func_name = "FORMAT_TIMESTAMP"
1351
+ elif isinstance(this, exp.TsOrDsToTime):
1352
+ func_name = "FORMAT_TIME"
1300
1353
  else:
1301
1354
  func_name = "FORMAT_DATE"
1302
1355
 
1303
- time_expr = (
1304
- this
1305
- if isinstance(this, (exp.TsOrDsToDatetime, exp.TsOrDsToTimestamp, exp.TsOrDsToDate))
1306
- else expression
1307
- )
1356
+ time_expr = this if isinstance(this, self.TS_OR_DS_TYPES) else expression
1308
1357
  return self.func(
1309
1358
  func_name, self.format_time(expression), time_expr.this, expression.args.get("zone")
1310
1359
  )
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
  import typing as t
3
3
  import datetime
4
4
  from sqlglot import exp, generator, parser, tokens
5
+ from sqlglot._typing import E
5
6
  from sqlglot.dialects.dialect import (
6
7
  Dialect,
7
8
  NormalizationStrategy,
@@ -31,14 +32,19 @@ from sqlglot.generator import unsupported_args
31
32
  DATEΤΙΜΕ_DELTA = t.Union[exp.DateAdd, exp.DateDiff, exp.DateSub, exp.TimestampSub, exp.TimestampAdd]
32
33
 
33
34
 
34
- def _build_date_format(args: t.List) -> exp.TimeToStr:
35
- expr = build_formatted_time(exp.TimeToStr, "clickhouse")(args)
35
+ def _build_datetime_format(
36
+ expr_type: t.Type[E],
37
+ ) -> t.Callable[[t.List], E]:
38
+ def _builder(args: t.List) -> E:
39
+ expr = build_formatted_time(expr_type, "clickhouse")(args)
36
40
 
37
- timezone = seq_get(args, 2)
38
- if timezone:
39
- expr.set("zone", timezone)
41
+ timezone = seq_get(args, 2)
42
+ if timezone:
43
+ expr.set("zone", timezone)
40
44
 
41
- return expr
45
+ return expr
46
+
47
+ return _builder
42
48
 
43
49
 
44
50
  def _unix_to_time_sql(self: ClickHouse.Generator, expression: exp.UnixToTime) -> str:
@@ -310,16 +316,17 @@ class ClickHouse(Dialect):
310
316
  "DATEADD": build_date_delta(exp.DateAdd, default_unit=None),
311
317
  "DATE_DIFF": build_date_delta(exp.DateDiff, default_unit=None, supports_timezone=True),
312
318
  "DATEDIFF": build_date_delta(exp.DateDiff, default_unit=None, supports_timezone=True),
313
- "DATE_FORMAT": _build_date_format,
319
+ "DATE_FORMAT": _build_datetime_format(exp.TimeToStr),
314
320
  "DATE_SUB": build_date_delta(exp.DateSub, default_unit=None),
315
321
  "DATESUB": build_date_delta(exp.DateSub, default_unit=None),
316
- "FORMATDATETIME": _build_date_format,
322
+ "FORMATDATETIME": _build_datetime_format(exp.TimeToStr),
317
323
  "JSONEXTRACTSTRING": build_json_extract_path(
318
324
  exp.JSONExtractScalar, zero_based_indexing=False
319
325
  ),
320
326
  "LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True),
321
327
  "MAP": parser.build_var_map,
322
328
  "MATCH": exp.RegexpLike.from_arg_list,
329
+ "PARSEDATETIME": _build_datetime_format(exp.ParseDatetime),
323
330
  "RANDCANONICAL": exp.Rand.from_arg_list,
324
331
  "STR_TO_DATE": _build_str_to_date,
325
332
  "TUPLE": exp.Struct.from_arg_list,
@@ -1141,6 +1148,7 @@ class ClickHouse(Dialect):
1141
1148
  exp.Levenshtein: unsupported_args("ins_cost", "del_cost", "sub_cost", "max_dist")(
1142
1149
  rename_func("editDistance")
1143
1150
  ),
1151
+ exp.ParseDatetime: rename_func("parseDateTime"),
1144
1152
  }
1145
1153
 
1146
1154
  PROPERTIES_LOCATION = {
@@ -1177,6 +1185,17 @@ class ClickHouse(Dialect):
1177
1185
  exp.DataType.Type.MULTIPOLYGON,
1178
1186
  }
1179
1187
 
1188
+ def offset_sql(self, expression: exp.Offset) -> str:
1189
+ offset = super().offset_sql(expression)
1190
+
1191
+ # OFFSET ... FETCH syntax requires a "ROW" or "ROWS" keyword
1192
+ # https://clickhouse.com/docs/sql-reference/statements/select/offset
1193
+ parent = expression.parent
1194
+ if isinstance(parent, exp.Select) and isinstance(parent.args.get("limit"), exp.Fetch):
1195
+ offset = f"{offset} ROWS"
1196
+
1197
+ return offset
1198
+
1180
1199
  def strtodate_sql(self, expression: exp.StrToDate) -> str:
1181
1200
  strtodate_sql = self.function_fallback_sql(expression)
1182
1201
 
@@ -99,7 +99,11 @@ class Databricks(Spark):
99
99
  exp.JSONExtract: _jsonextract_sql,
100
100
  exp.JSONExtractScalar: _jsonextract_sql,
101
101
  exp.JSONPathRoot: lambda *_: "",
102
- exp.ToChar: lambda self, e: self.function_fallback_sql(e),
102
+ exp.ToChar: lambda self, e: (
103
+ self.cast_sql(exp.Cast(this=e.this, to=exp.DataType(this="STRING")))
104
+ if e.args.get("is_numeric")
105
+ else self.function_fallback_sql(e)
106
+ ),
103
107
  }
104
108
 
105
109
  TRANSFORMS.pop(exp.TryCast)