sqlglot 27.7.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 (226) hide show
  1. {sqlglot-27.7.0 → sqlglot-27.8.0}/CHANGELOG.md +131 -0
  2. {sqlglot-27.7.0 → sqlglot-27.8.0}/PKG-INFO +2 -2
  3. {sqlglot-27.7.0 → sqlglot-27.8.0}/README.md +1 -1
  4. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/_version.py +16 -3
  5. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/bigquery.py +17 -3
  6. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/databricks.py +5 -1
  7. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/dialect.py +72 -23
  8. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/dremio.py +29 -8
  9. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/duckdb.py +7 -40
  10. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/exasol.py +5 -0
  11. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/mysql.py +0 -15
  12. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/presto.py +0 -2
  13. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/singlestore.py +94 -1
  14. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/spark.py +6 -0
  15. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/trino.py +1 -0
  16. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/expressions.py +28 -3
  17. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/generator.py +6 -1
  18. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/jsonpath.py +10 -3
  19. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/parser.py +15 -1
  20. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot.egg-info/PKG-INFO +2 -2
  21. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_bigquery.py +6 -0
  22. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_databricks.py +13 -1
  23. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_dialect.py +144 -0
  24. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_dremio.py +35 -2
  25. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_exasol.py +2 -0
  26. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_singlestore.py +88 -0
  27. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_trino.py +16 -0
  28. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/annotate_functions.sql +56 -0
  29. {sqlglot-27.7.0 → sqlglot-27.8.0}/.gitignore +0 -0
  30. {sqlglot-27.7.0 → sqlglot-27.8.0}/.gitpod.yml +0 -0
  31. {sqlglot-27.7.0 → sqlglot-27.8.0}/.pre-commit-config.yaml +0 -0
  32. {sqlglot-27.7.0 → sqlglot-27.8.0}/CONTRIBUTING.md +0 -0
  33. {sqlglot-27.7.0 → sqlglot-27.8.0}/LICENSE +0 -0
  34. {sqlglot-27.7.0 → sqlglot-27.8.0}/MANIFEST.in +0 -0
  35. {sqlglot-27.7.0 → sqlglot-27.8.0}/Makefile +0 -0
  36. {sqlglot-27.7.0 → sqlglot-27.8.0}/pyproject.toml +0 -0
  37. {sqlglot-27.7.0 → sqlglot-27.8.0}/setup.cfg +0 -0
  38. {sqlglot-27.7.0 → sqlglot-27.8.0}/setup.py +0 -0
  39. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/__init__.py +0 -0
  40. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/__main__.py +0 -0
  41. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/_typing.py +0 -0
  42. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/__init__.py +0 -0
  43. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/athena.py +0 -0
  44. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/clickhouse.py +0 -0
  45. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/doris.py +0 -0
  46. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/drill.py +0 -0
  47. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/druid.py +0 -0
  48. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/dune.py +0 -0
  49. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/fabric.py +0 -0
  50. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/hive.py +0 -0
  51. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/materialize.py +0 -0
  52. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/oracle.py +0 -0
  53. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/postgres.py +0 -0
  54. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/prql.py +0 -0
  55. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/redshift.py +0 -0
  56. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/risingwave.py +0 -0
  57. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/snowflake.py +0 -0
  58. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/spark2.py +0 -0
  59. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/sqlite.py +0 -0
  60. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/starrocks.py +0 -0
  61. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/tableau.py +0 -0
  62. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/teradata.py +0 -0
  63. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/dialects/tsql.py +0 -0
  64. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/diff.py +0 -0
  65. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/errors.py +0 -0
  66. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/executor/__init__.py +0 -0
  67. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/executor/context.py +0 -0
  68. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/executor/env.py +0 -0
  69. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/executor/python.py +0 -0
  70. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/executor/table.py +0 -0
  71. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/helper.py +0 -0
  72. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/lineage.py +0 -0
  73. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/__init__.py +0 -0
  74. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/annotate_types.py +0 -0
  75. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/canonicalize.py +0 -0
  76. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
  77. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
  78. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
  79. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  80. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/merge_subqueries.py +0 -0
  81. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/normalize.py +0 -0
  82. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  83. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/optimize_joins.py +0 -0
  84. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/optimizer.py +0 -0
  85. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
  86. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
  87. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/qualify.py +0 -0
  88. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/qualify_columns.py +0 -0
  89. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/qualify_tables.py +0 -0
  90. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/scope.py +0 -0
  91. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/simplify.py +0 -0
  92. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/optimizer/unnest_subqueries.py +0 -0
  93. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/planner.py +0 -0
  94. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/py.typed +0 -0
  95. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/schema.py +0 -0
  96. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/serde.py +0 -0
  97. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/time.py +0 -0
  98. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/tokens.py +0 -0
  99. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/transforms.py +0 -0
  100. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot/trie.py +0 -0
  101. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot.egg-info/SOURCES.txt +0 -0
  102. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot.egg-info/dependency_links.txt +0 -0
  103. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot.egg-info/requires.txt +0 -0
  104. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot.egg-info/top_level.txt +0 -0
  105. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglot.png +0 -0
  106. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/Cargo.lock +0 -0
  107. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/Cargo.toml +0 -0
  108. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/benches/dialect_settings.json +0 -0
  109. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/benches/long.rs +0 -0
  110. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/benches/token_type_settings.json +0 -0
  111. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/benches/tokenizer_dialect_settings.json +0 -0
  112. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/benches/tokenizer_settings.json +0 -0
  113. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/pyproject.toml +0 -0
  114. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/src/lib.rs +0 -0
  115. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/src/settings.rs +0 -0
  116. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/src/token.rs +0 -0
  117. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/src/tokenizer.rs +0 -0
  118. {sqlglot-27.7.0 → sqlglot-27.8.0}/sqlglotrs/src/trie.rs +0 -0
  119. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/__init__.py +0 -0
  120. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/__init__.py +0 -0
  121. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_athena.py +0 -0
  122. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_clickhouse.py +0 -0
  123. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_doris.py +0 -0
  124. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_drill.py +0 -0
  125. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_druid.py +0 -0
  126. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_duckdb.py +0 -0
  127. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_dune.py +0 -0
  128. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_fabric.py +0 -0
  129. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_hive.py +0 -0
  130. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_materialize.py +0 -0
  131. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_mysql.py +0 -0
  132. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_oracle.py +0 -0
  133. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_pipe_syntax.py +0 -0
  134. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_postgres.py +0 -0
  135. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_presto.py +0 -0
  136. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_prql.py +0 -0
  137. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_redshift.py +0 -0
  138. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_risingwave.py +0 -0
  139. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_snowflake.py +0 -0
  140. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_spark.py +0 -0
  141. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_sqlite.py +0 -0
  142. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_starrocks.py +0 -0
  143. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_tableau.py +0 -0
  144. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_teradata.py +0 -0
  145. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/dialects/test_tsql.py +0 -0
  146. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/identity.sql +0 -0
  147. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/jsonpath/LICENSE +0 -0
  148. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/jsonpath/cts.json +0 -0
  149. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
  150. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
  151. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
  152. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
  153. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
  154. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
  155. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
  156. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/normalize.sql +0 -0
  157. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
  158. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
  159. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/optimizer.sql +0 -0
  160. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
  161. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
  162. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
  163. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/qualify_columns.sql +0 -0
  164. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
  165. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
  166. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
  167. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
  168. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
  169. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/simplify.sql +0 -0
  170. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
  171. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
  172. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
  173. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
  174. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
  175. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
  176. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
  177. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
  178. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
  179. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
  180. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
  181. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
  182. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
  183. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
  184. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
  185. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
  186. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
  187. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
  188. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
  189. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
  190. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
  191. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
  192. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
  193. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
  194. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
  195. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
  196. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
  197. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
  198. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
  199. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
  200. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
  201. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
  202. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
  203. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
  204. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
  205. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/partial.sql +0 -0
  206. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/fixtures/pretty.sql +0 -0
  207. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/gen_fixtures.py +0 -0
  208. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/helpers.py +0 -0
  209. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_build.py +0 -0
  210. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_dialect_imports.py +0 -0
  211. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_diff.py +0 -0
  212. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_docs.py +0 -0
  213. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_executor.py +0 -0
  214. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_expressions.py +0 -0
  215. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_generator.py +0 -0
  216. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_helper.py +0 -0
  217. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_jsonpath.py +0 -0
  218. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_lineage.py +0 -0
  219. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_optimizer.py +0 -0
  220. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_parser.py +0 -0
  221. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_schema.py +0 -0
  222. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_serde.py +0 -0
  223. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_time.py +0 -0
  224. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_tokens.py +0 -0
  225. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_transforms.py +0 -0
  226. {sqlglot-27.7.0 → sqlglot-27.8.0}/tests/test_transpile.py +0 -0
@@ -1,6 +1,136 @@
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
+
4
134
  ## [v27.6.0] - 2025-08-01
5
135
  ### :boom: BREAKING CHANGES
6
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))*:
@@ -6404,3 +6534,4 @@ Changelog
6404
6534
  [v27.5.0]: https://github.com/tobymao/sqlglot/compare/v27.4.1...v27.5.0
6405
6535
  [v27.5.1]: https://github.com/tobymao/sqlglot/compare/v27.5.0...v27.5.1
6406
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.7.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.7.0'
21
- __version_tuple__ = version_tuple = (27, 7, 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),
@@ -495,6 +496,7 @@ class BigQuery(Dialect):
495
496
  exp.GenerateTimestampArray: lambda self, e: self._annotate_with_type(
496
497
  e, exp.DataType.build("ARRAY<TIMESTAMP>", dialect="bigquery")
497
498
  ),
499
+ exp.Grouping: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BIGINT),
498
500
  exp.JSONArray: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.JSON),
499
501
  exp.JSONExtractScalar: lambda self, e: self._annotate_with_type(
500
502
  e, exp.DataType.Type.VARCHAR
@@ -504,9 +506,13 @@ class BigQuery(Dialect):
504
506
  ),
505
507
  exp.JSONType: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.VARCHAR),
506
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),
507
510
  exp.ParseTime: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.TIME),
508
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"),
509
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),
510
516
  exp.SHA: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BINARY),
511
517
  exp.SHA2: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BINARY),
512
518
  exp.Sign: lambda self, e: self._annotate_by_args(e, "this"),
@@ -518,6 +524,7 @@ class BigQuery(Dialect):
518
524
  exp.TimeFromParts: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.TIME),
519
525
  exp.TsOrDsToTime: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.TIME),
520
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"),
521
528
  exp.Unicode: lambda self, e: self._annotate_with_type(e, exp.DataType.Type.BIGINT),
522
529
  }
523
530
 
@@ -550,6 +557,12 @@ class BigQuery(Dialect):
550
557
 
551
558
  return super().normalize_identifier(expression)
552
559
 
560
+ class JSONPathTokenizer(jsonpath.JSONPathTokenizer):
561
+ VAR_TOKENS = {
562
+ TokenType.DASH,
563
+ TokenType.VAR,
564
+ }
565
+
553
566
  class Tokenizer(tokens.Tokenizer):
554
567
  QUOTES = ["'", '"', '"""', "'''"]
555
568
  COMMENTS = ["--", "#", ("/*", "*/")]
@@ -1019,6 +1032,8 @@ class BigQuery(Dialect):
1019
1032
  EXCEPT_INTERSECT_SUPPORT_ALL_CLAUSE = False
1020
1033
  SUPPORTS_UNIX_SECONDS = True
1021
1034
 
1035
+ SAFE_JSON_PATH_KEY_RE = re.compile(r"^[_\-a-zA-Z][\-\w]*$")
1036
+
1022
1037
  TS_OR_DS_TYPES = (
1023
1038
  exp.TsOrDsToDatetime,
1024
1039
  exp.TsOrDsToTimestamp,
@@ -1107,7 +1122,6 @@ class BigQuery(Dialect):
1107
1122
  ),
1108
1123
  exp.SHA: rename_func("SHA1"),
1109
1124
  exp.SHA2: sha256_sql,
1110
- exp.Space: space_sql,
1111
1125
  exp.StabilityProperty: lambda self, e: (
1112
1126
  "DETERMINISTIC" if e.name == "IMMUTABLE" else "NOT DETERMINISTIC"
1113
1127
  ),
@@ -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)
@@ -35,8 +35,18 @@ DATE_ADD_OR_DIFF = t.Union[
35
35
  exp.TsOrDsDiff,
36
36
  ]
37
37
  DATE_ADD_OR_SUB = t.Union[exp.DateAdd, exp.TsOrDsAdd, exp.DateSub]
38
- JSON_EXTRACT_TYPE = t.Union[exp.JSONExtract, exp.JSONExtractScalar]
39
-
38
+ JSON_EXTRACT_TYPE = t.Union[
39
+ exp.JSONExtract, exp.JSONExtractScalar, exp.JSONBExtract, exp.JSONBExtractScalar
40
+ ]
41
+ DATETIME_DELTA = t.Union[
42
+ exp.DateAdd,
43
+ exp.DatetimeAdd,
44
+ exp.DatetimeSub,
45
+ exp.TimeAdd,
46
+ exp.TimeSub,
47
+ exp.TimestampSub,
48
+ exp.TsOrDsAdd,
49
+ ]
40
50
 
41
51
  if t.TYPE_CHECKING:
42
52
  from sqlglot._typing import B, E, F
@@ -1059,7 +1069,9 @@ class Dialect(metaclass=_Dialect):
1059
1069
  try:
1060
1070
  return parse_json_path(path_text, self)
1061
1071
  except ParseError as e:
1062
- if self.STRICT_JSON_PATH_SYNTAX:
1072
+ if self.STRICT_JSON_PATH_SYNTAX and not path_text.lstrip().startswith(
1073
+ ("lax", "strict")
1074
+ ):
1063
1075
  logger.warning(f"Invalid JSON path syntax. {str(e)}")
1064
1076
 
1065
1077
  return path
@@ -1643,14 +1655,49 @@ def date_delta_sql(name: str, cast: bool = False) -> t.Callable[[Generator, DATE
1643
1655
  return _delta_sql
1644
1656
 
1645
1657
 
1658
+ def date_delta_to_binary_interval_op(
1659
+ cast: bool = True,
1660
+ ) -> t.Callable[[Generator, DATETIME_DELTA], str]:
1661
+ def date_delta_to_binary_interval_op_sql(self: Generator, expression: DATETIME_DELTA) -> str:
1662
+ this = expression.this
1663
+ unit = unit_to_var(expression)
1664
+ op = (
1665
+ "+"
1666
+ if isinstance(expression, (exp.DateAdd, exp.TimeAdd, exp.DatetimeAdd, exp.TsOrDsAdd))
1667
+ else "-"
1668
+ )
1669
+
1670
+ to_type: t.Optional[exp.DATA_TYPE] = None
1671
+ if cast:
1672
+ if isinstance(expression, exp.TsOrDsAdd):
1673
+ to_type = expression.return_type
1674
+ elif this.is_string:
1675
+ # Cast string literals (i.e function parameters) to the appropriate type for +/- interval to work
1676
+ to_type = (
1677
+ exp.DataType.Type.DATETIME
1678
+ if isinstance(expression, (exp.DatetimeAdd, exp.DatetimeSub))
1679
+ else exp.DataType.Type.DATE
1680
+ )
1681
+
1682
+ this = exp.cast(this, to_type) if to_type else this
1683
+
1684
+ expr = expression.expression
1685
+ interval = expr if isinstance(expr, exp.Interval) else exp.Interval(this=expr, unit=unit)
1686
+
1687
+ return f"{self.sql(this)} {op} {self.sql(interval)}"
1688
+
1689
+ return date_delta_to_binary_interval_op_sql
1690
+
1691
+
1646
1692
  def unit_to_str(expression: exp.Expression, default: str = "DAY") -> t.Optional[exp.Expression]:
1647
1693
  unit = expression.args.get("unit")
1694
+ if not unit:
1695
+ return exp.Literal.string(default) if default else None
1648
1696
 
1649
- if isinstance(unit, exp.Placeholder):
1697
+ if isinstance(unit, exp.Placeholder) or type(unit) not in (exp.Var, exp.Literal):
1650
1698
  return unit
1651
- if unit:
1652
- return exp.Literal.string(unit.name)
1653
- return exp.Literal.string(default) if default else None
1699
+
1700
+ return exp.Literal.string(unit.name)
1654
1701
 
1655
1702
 
1656
1703
  def unit_to_var(expression: exp.Expression, default: str = "DAY") -> t.Optional[exp.Expression]:
@@ -1730,7 +1777,10 @@ def merge_without_target_sql(self: Generator, expression: exp.Merge) -> str:
1730
1777
 
1731
1778
 
1732
1779
  def build_json_extract_path(
1733
- expr_type: t.Type[F], zero_based_indexing: bool = True, arrow_req_json_type: bool = False
1780
+ expr_type: t.Type[F],
1781
+ zero_based_indexing: bool = True,
1782
+ arrow_req_json_type: bool = False,
1783
+ json_type: t.Optional[str] = None,
1734
1784
  ) -> t.Callable[[t.List], F]:
1735
1785
  def _builder(args: t.List) -> F:
1736
1786
  segments: t.List[exp.JSONPathPart] = [exp.JSONPathRoot()]
@@ -1750,11 +1800,19 @@ def build_json_extract_path(
1750
1800
 
1751
1801
  # This is done to avoid failing in the expression validator due to the arg count
1752
1802
  del args[2:]
1753
- return expr_type(
1754
- this=seq_get(args, 0),
1755
- expression=exp.JSONPath(expressions=segments),
1756
- only_json_types=arrow_req_json_type,
1757
- )
1803
+ kwargs = {
1804
+ "this": seq_get(args, 0),
1805
+ "expression": exp.JSONPath(expressions=segments),
1806
+ }
1807
+
1808
+ is_jsonb = issubclass(expr_type, (exp.JSONBExtract, exp.JSONBExtractScalar))
1809
+ if not is_jsonb:
1810
+ kwargs["only_json_types"] = arrow_req_json_type
1811
+
1812
+ if json_type is not None:
1813
+ kwargs["json_type"] = json_type
1814
+
1815
+ return expr_type(**kwargs)
1758
1816
 
1759
1817
  return _builder
1760
1818
 
@@ -1962,7 +2020,7 @@ def groupconcat_sql(
1962
2020
  return self.sql(listagg)
1963
2021
 
1964
2022
 
1965
- def build_timetostr_or_tochar(args: t.List, dialect: Dialect) -> exp.TimeToStr | exp.ToChar:
2023
+ def build_timetostr_or_tochar(args: t.List, dialect: DialectType) -> exp.TimeToStr | exp.ToChar:
1966
2024
  if len(args) == 2:
1967
2025
  this = args[0]
1968
2026
  if not this.type:
@@ -1983,12 +2041,3 @@ def build_replace_with_optional_replacement(args: t.List) -> exp.Replace:
1983
2041
  expression=seq_get(args, 1),
1984
2042
  replacement=seq_get(args, 2) or exp.Literal.string(""),
1985
2043
  )
1986
-
1987
-
1988
- def space_sql(self: Generator, expression: exp.Space) -> str:
1989
- return self.sql(
1990
- exp.Repeat(
1991
- this=exp.Literal.string(" "),
1992
- times=expression.this,
1993
- )
1994
- )
@@ -1,14 +1,22 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import typing as t
4
+
3
5
  from sqlglot import expressions as exp
4
6
  from sqlglot import parser, generator, tokens
5
- from sqlglot.dialects.dialect import Dialect, build_formatted_time, unit_to_var
6
- import typing as t
7
+ from sqlglot.dialects.dialect import (
8
+ Dialect,
9
+ build_timetostr_or_tochar,
10
+ build_formatted_time,
11
+ rename_func,
12
+ unit_to_var,
13
+ )
14
+ from sqlglot.helper import seq_get
15
+
16
+ if t.TYPE_CHECKING:
17
+ from sqlglot.dialects.dialect import DialectType
7
18
 
8
- DATE_DELTA = t.Union[
9
- exp.DateAdd,
10
- exp.DateSub,
11
- ]
19
+ DATE_DELTA = t.Union[exp.DateAdd, exp.DateSub]
12
20
 
13
21
 
14
22
  def _date_delta_sql(name: str) -> t.Callable[[Dremio.Generator, DATE_DELTA], str]:
@@ -31,6 +39,17 @@ def _date_delta_sql(name: str) -> t.Callable[[Dremio.Generator, DATE_DELTA], str
31
39
  return _delta_sql
32
40
 
33
41
 
42
+ def to_char_is_numeric_handler(args: t.List, dialect: DialectType) -> exp.TimeToStr | exp.ToChar:
43
+ expression = build_timetostr_or_tochar(args, dialect)
44
+ fmt = seq_get(args, 1)
45
+
46
+ if fmt and isinstance(expression, exp.ToChar) and fmt.is_string and "#" in fmt.name:
47
+ # Only mark as numeric if format is a literal containing #
48
+ expression.set("is_numeric", True)
49
+
50
+ return expression
51
+
52
+
34
53
  class Dremio(Dialect):
35
54
  SUPPORTS_USER_DEFINED_TYPES = False
36
55
  CONCAT_COALESCE = True
@@ -94,7 +113,9 @@ class Dremio(Dialect):
94
113
 
95
114
  FUNCTIONS = {
96
115
  **parser.Parser.FUNCTIONS,
97
- "TO_CHAR": build_formatted_time(exp.TimeToStr, "dremio"),
116
+ "TO_CHAR": to_char_is_numeric_handler,
117
+ "DATE_FORMAT": build_formatted_time(exp.TimeToStr, "dremio"),
118
+ "TO_DATE": build_formatted_time(exp.TsOrDsToDate, "dremio"),
98
119
  }
99
120
 
100
121
  class Generator(generator.Generator):
@@ -123,8 +144,8 @@ class Dremio(Dialect):
123
144
 
124
145
  TRANSFORMS = {
125
146
  **generator.Generator.TRANSFORMS,
147
+ exp.ToChar: rename_func("TO_CHAR"),
126
148
  exp.TimeToStr: lambda self, e: self.func("TO_CHAR", e.this, self.format_time(e)),
127
- exp.ToChar: lambda self, e: self.function_fallback_sql(e),
128
149
  exp.DateAdd: _date_delta_sql("DATE_ADD"),
129
150
  exp.DateSub: _date_delta_sql("DATE_SUB"),
130
151
  }
@@ -4,7 +4,6 @@ import typing as t
4
4
 
5
5
  from sqlglot import exp, generator, parser, tokens, transforms
6
6
 
7
- from sqlglot.expressions import DATA_TYPE
8
7
  from sqlglot.dialects.dialect import (
9
8
  Dialect,
10
9
  JSON_EXTRACT_TYPE,
@@ -16,6 +15,7 @@ from sqlglot.dialects.dialect import (
16
15
  bool_xor_sql,
17
16
  build_default_decimal_type,
18
17
  count_if_to_sum,
18
+ date_delta_to_binary_interval_op,
19
19
  date_trunc_to_time,
20
20
  datestrtodate_sql,
21
21
  no_datetime_sql,
@@ -32,7 +32,6 @@ from sqlglot.dialects.dialect import (
32
32
  str_to_time_sql,
33
33
  timestamptrunc_sql,
34
34
  timestrtotime_sql,
35
- unit_to_var,
36
35
  unit_to_str,
37
36
  sha256_sql,
38
37
  build_regexp_extract,
@@ -45,38 +44,6 @@ from sqlglot.helper import seq_get
45
44
  from sqlglot.tokens import TokenType
46
45
  from sqlglot.parser import binary_range_parser
47
46
 
48
- DATETIME_DELTA = t.Union[
49
- exp.DateAdd, exp.TimeAdd, exp.DatetimeAdd, exp.TsOrDsAdd, exp.DateSub, exp.DatetimeSub
50
- ]
51
-
52
-
53
- def _date_delta_sql(self: DuckDB.Generator, expression: DATETIME_DELTA) -> str:
54
- this = expression.this
55
- unit = unit_to_var(expression)
56
- op = (
57
- "+"
58
- if isinstance(expression, (exp.DateAdd, exp.TimeAdd, exp.DatetimeAdd, exp.TsOrDsAdd))
59
- else "-"
60
- )
61
-
62
- to_type: t.Optional[DATA_TYPE] = None
63
- if isinstance(expression, exp.TsOrDsAdd):
64
- to_type = expression.return_type
65
- elif this.is_string:
66
- # Cast string literals (i.e function parameters) to the appropriate type for +/- interval to work
67
- to_type = (
68
- exp.DataType.Type.DATETIME
69
- if isinstance(expression, (exp.DatetimeAdd, exp.DatetimeSub))
70
- else exp.DataType.Type.DATE
71
- )
72
-
73
- this = exp.cast(this, to_type) if to_type else this
74
-
75
- expr = expression.expression
76
- interval = expr if isinstance(expr, exp.Interval) else exp.Interval(this=expr, unit=unit)
77
-
78
- return f"{self.sql(this)} {op} {self.sql(interval)}"
79
-
80
47
 
81
48
  # BigQuery -> DuckDB conversion for the DATE function
82
49
  def _date_sql(self: DuckDB.Generator, expression: exp.Date) -> str:
@@ -687,14 +654,14 @@ class DuckDB(Dialect):
687
654
  exp.DayOfYear: rename_func("DAYOFYEAR"),
688
655
  exp.DataType: _datatype_sql,
689
656
  exp.Date: _date_sql,
690
- exp.DateAdd: _date_delta_sql,
657
+ exp.DateAdd: date_delta_to_binary_interval_op(),
691
658
  exp.DateFromParts: rename_func("MAKE_DATE"),
692
- exp.DateSub: _date_delta_sql,
659
+ exp.DateSub: date_delta_to_binary_interval_op(),
693
660
  exp.DateDiff: _date_diff_sql,
694
661
  exp.DateStrToDate: datestrtodate_sql,
695
662
  exp.Datetime: no_datetime_sql,
696
- exp.DatetimeSub: _date_delta_sql,
697
- exp.DatetimeAdd: _date_delta_sql,
663
+ exp.DatetimeSub: date_delta_to_binary_interval_op(),
664
+ exp.DatetimeAdd: date_delta_to_binary_interval_op(),
698
665
  exp.DateToDi: lambda self,
699
666
  e: f"CAST(STRFTIME({self.sql(e, 'this')}, {DuckDB.DATEINT_FORMAT}) AS INT)",
700
667
  exp.Decode: lambda self, e: encode_decode_sql(self, e, "DECODE", replace=False),
@@ -756,7 +723,7 @@ class DuckDB(Dialect):
756
723
  ),
757
724
  exp.Struct: _struct_sql,
758
725
  exp.Transform: rename_func("LIST_TRANSFORM"),
759
- exp.TimeAdd: _date_delta_sql,
726
+ exp.TimeAdd: date_delta_to_binary_interval_op(),
760
727
  exp.Time: no_time_sql,
761
728
  exp.TimeDiff: _timediff_sql,
762
729
  exp.Timestamp: no_timestamp_sql,
@@ -773,7 +740,7 @@ class DuckDB(Dialect):
773
740
  exp.TimeToUnix: rename_func("EPOCH"),
774
741
  exp.TsOrDiToDi: lambda self,
775
742
  e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS TEXT), '-', ''), 1, 8) AS INT)",
776
- exp.TsOrDsAdd: _date_delta_sql,
743
+ exp.TsOrDsAdd: date_delta_to_binary_interval_op(),
777
744
  exp.TsOrDsDiff: lambda self, e: self.func(
778
745
  "DATE_DIFF",
779
746
  f"'{e.args.get('unit') or 'DAY'}'",