sqlglot 27.25.2__tar.gz → 27.26.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 (228) hide show
  1. {sqlglot-27.25.2 → sqlglot-27.26.0}/PKG-INFO +1 -1
  2. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/_version.py +3 -3
  3. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/clickhouse.py +3 -1
  4. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/dialect.py +2 -1
  5. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/duckdb.py +16 -3
  6. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/postgres.py +1 -1
  7. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/snowflake.py +6 -0
  8. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/tsql.py +2 -1
  9. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/expressions.py +12 -2
  10. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/generator.py +7 -3
  11. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/qualify_columns.py +2 -2
  12. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/qualify_tables.py +2 -1
  13. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/unnest_subqueries.py +1 -1
  14. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/parser.py +13 -4
  15. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/transforms.py +2 -2
  16. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot.egg-info/PKG-INFO +1 -1
  17. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_bigquery.py +8 -0
  18. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_duckdb.py +13 -0
  19. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_mysql.py +2 -2
  20. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_snowflake.py +23 -0
  21. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/identity.sql +1 -0
  22. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/annotate_functions.sql +52 -0
  23. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_parser.py +2 -0
  24. {sqlglot-27.25.2 → sqlglot-27.26.0}/.gitignore +0 -0
  25. {sqlglot-27.25.2 → sqlglot-27.26.0}/.gitpod.yml +0 -0
  26. {sqlglot-27.25.2 → sqlglot-27.26.0}/.pre-commit-config.yaml +0 -0
  27. {sqlglot-27.25.2 → sqlglot-27.26.0}/CHANGELOG.md +0 -0
  28. {sqlglot-27.25.2 → sqlglot-27.26.0}/CONTRIBUTING.md +0 -0
  29. {sqlglot-27.25.2 → sqlglot-27.26.0}/LICENSE +0 -0
  30. {sqlglot-27.25.2 → sqlglot-27.26.0}/MANIFEST.in +0 -0
  31. {sqlglot-27.25.2 → sqlglot-27.26.0}/Makefile +0 -0
  32. {sqlglot-27.25.2 → sqlglot-27.26.0}/README.md +0 -0
  33. {sqlglot-27.25.2 → sqlglot-27.26.0}/pyproject.toml +0 -0
  34. {sqlglot-27.25.2 → sqlglot-27.26.0}/setup.cfg +0 -0
  35. {sqlglot-27.25.2 → sqlglot-27.26.0}/setup.py +0 -0
  36. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/__init__.py +0 -0
  37. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/__main__.py +0 -0
  38. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/_typing.py +0 -0
  39. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/__init__.py +0 -0
  40. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/athena.py +0 -0
  41. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/bigquery.py +0 -0
  42. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/databricks.py +0 -0
  43. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/doris.py +0 -0
  44. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/dremio.py +0 -0
  45. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/drill.py +0 -0
  46. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/druid.py +0 -0
  47. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/dune.py +0 -0
  48. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/exasol.py +0 -0
  49. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/fabric.py +0 -0
  50. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/hive.py +0 -0
  51. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/materialize.py +0 -0
  52. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/mysql.py +0 -0
  53. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/oracle.py +0 -0
  54. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/presto.py +0 -0
  55. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/prql.py +0 -0
  56. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/redshift.py +0 -0
  57. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/risingwave.py +0 -0
  58. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/singlestore.py +0 -0
  59. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/solr.py +0 -0
  60. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/spark.py +0 -0
  61. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/spark2.py +0 -0
  62. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/sqlite.py +0 -0
  63. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/starrocks.py +0 -0
  64. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/tableau.py +0 -0
  65. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/teradata.py +0 -0
  66. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/dialects/trino.py +0 -0
  67. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/diff.py +0 -0
  68. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/errors.py +0 -0
  69. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/executor/__init__.py +0 -0
  70. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/executor/context.py +0 -0
  71. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/executor/env.py +0 -0
  72. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/executor/python.py +0 -0
  73. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/executor/table.py +0 -0
  74. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/helper.py +0 -0
  75. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/jsonpath.py +0 -0
  76. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/lineage.py +0 -0
  77. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/__init__.py +0 -0
  78. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/annotate_types.py +0 -0
  79. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/canonicalize.py +0 -0
  80. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
  81. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
  82. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
  83. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  84. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/merge_subqueries.py +0 -0
  85. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/normalize.py +0 -0
  86. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  87. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/optimize_joins.py +0 -0
  88. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/optimizer.py +0 -0
  89. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
  90. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
  91. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/qualify.py +0 -0
  92. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/scope.py +0 -0
  93. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/optimizer/simplify.py +0 -0
  94. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/planner.py +0 -0
  95. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/py.typed +0 -0
  96. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/schema.py +0 -0
  97. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/serde.py +0 -0
  98. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/time.py +0 -0
  99. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/tokens.py +0 -0
  100. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot/trie.py +0 -0
  101. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot.egg-info/SOURCES.txt +0 -0
  102. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot.egg-info/dependency_links.txt +0 -0
  103. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot.egg-info/requires.txt +0 -0
  104. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot.egg-info/top_level.txt +0 -0
  105. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglot.png +0 -0
  106. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/Cargo.lock +0 -0
  107. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/Cargo.toml +0 -0
  108. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/benches/dialect_settings.json +0 -0
  109. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/benches/long.rs +0 -0
  110. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/benches/token_type_settings.json +0 -0
  111. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/benches/tokenizer_dialect_settings.json +0 -0
  112. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/benches/tokenizer_settings.json +0 -0
  113. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/pyproject.toml +0 -0
  114. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/src/lib.rs +0 -0
  115. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/src/settings.rs +0 -0
  116. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/src/token.rs +0 -0
  117. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/src/tokenizer.rs +0 -0
  118. {sqlglot-27.25.2 → sqlglot-27.26.0}/sqlglotrs/src/trie.rs +0 -0
  119. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/__init__.py +0 -0
  120. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/__init__.py +0 -0
  121. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_athena.py +0 -0
  122. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_clickhouse.py +0 -0
  123. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_databricks.py +0 -0
  124. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_dialect.py +0 -0
  125. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_doris.py +0 -0
  126. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_dremio.py +0 -0
  127. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_drill.py +0 -0
  128. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_druid.py +0 -0
  129. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_dune.py +0 -0
  130. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_exasol.py +0 -0
  131. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_fabric.py +0 -0
  132. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_hive.py +0 -0
  133. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_materialize.py +0 -0
  134. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_oracle.py +0 -0
  135. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_pipe_syntax.py +0 -0
  136. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_postgres.py +0 -0
  137. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_presto.py +0 -0
  138. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_prql.py +0 -0
  139. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_redshift.py +0 -0
  140. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_risingwave.py +0 -0
  141. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_singlestore.py +0 -0
  142. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_solr.py +0 -0
  143. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_spark.py +0 -0
  144. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_sqlite.py +0 -0
  145. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_starrocks.py +0 -0
  146. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_tableau.py +0 -0
  147. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_teradata.py +0 -0
  148. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_trino.py +0 -0
  149. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/dialects/test_tsql.py +0 -0
  150. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/jsonpath/LICENSE +0 -0
  151. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/jsonpath/cts.json +0 -0
  152. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
  153. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
  154. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
  155. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
  156. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
  157. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
  158. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
  159. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/normalize.sql +0 -0
  160. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
  161. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
  162. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/optimizer.sql +0 -0
  163. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
  164. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
  165. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
  166. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/qualify_columns.sql +0 -0
  167. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
  168. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
  169. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
  170. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
  171. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
  172. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/simplify.sql +0 -0
  173. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
  174. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
  175. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
  176. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
  177. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
  178. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
  179. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
  180. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
  181. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
  182. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
  183. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
  184. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
  185. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
  186. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
  187. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
  188. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
  189. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
  190. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
  191. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
  192. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
  193. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
  194. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
  195. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
  196. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
  197. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
  198. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
  199. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
  200. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
  201. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
  202. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
  203. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
  204. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
  205. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
  206. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
  207. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
  208. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/partial.sql +0 -0
  209. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/fixtures/pretty.sql +0 -0
  210. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/gen_fixtures.py +0 -0
  211. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/helpers.py +0 -0
  212. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_build.py +0 -0
  213. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_dialect_imports.py +0 -0
  214. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_diff.py +0 -0
  215. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_docs.py +0 -0
  216. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_executor.py +0 -0
  217. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_expressions.py +0 -0
  218. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_generator.py +0 -0
  219. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_helper.py +0 -0
  220. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_jsonpath.py +0 -0
  221. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_lineage.py +0 -0
  222. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_optimizer.py +0 -0
  223. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_schema.py +0 -0
  224. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_serde.py +0 -0
  225. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_time.py +0 -0
  226. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_tokens.py +0 -0
  227. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_transforms.py +0 -0
  228. {sqlglot-27.25.2 → sqlglot-27.26.0}/tests/test_transpile.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 27.25.2
3
+ Version: 27.26.0
4
4
  Summary: An easily customizable SQL parser and transpiler
5
5
  Author-email: Toby Mao <toby.mao@gmail.com>
6
6
  License-Expression: MIT
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '27.25.2'
32
- __version_tuple__ = version_tuple = (27, 25, 2)
31
+ __version__ = version = '27.26.0'
32
+ __version_tuple__ = version_tuple = (27, 26, 0)
33
33
 
34
- __commit_id__ = commit_id = 'gcd09ea78d'
34
+ __commit_id__ = commit_id = 'gc94e3e0e4'
@@ -769,7 +769,9 @@ class ClickHouse(Dialect):
769
769
  ) -> t.Optional[exp.Join]:
770
770
  join = super()._parse_join(skip_join_token=skip_join_token, parse_bracket=True)
771
771
  if join:
772
- join.set("global", join.args.pop("method", None))
772
+ method = join.args.get("method")
773
+ join.set("method", None)
774
+ join.set("global", method)
773
775
 
774
776
  # tbl ARRAY JOIN arr <-- this should be a `Column` reference, not a `Table`
775
777
  # https://clickhouse.com/docs/en/sql-reference/statements/select/array-join
@@ -721,6 +721,7 @@ class Dialect(metaclass=_Dialect):
721
721
  exp.Exp,
722
722
  exp.Ln,
723
723
  exp.Log,
724
+ exp.Pi,
724
725
  exp.Pow,
725
726
  exp.Quantile,
726
727
  exp.Round,
@@ -1195,7 +1196,7 @@ def no_paren_current_date_sql(self: Generator, expression: exp.CurrentDate) -> s
1195
1196
  def no_recursive_cte_sql(self: Generator, expression: exp.With) -> str:
1196
1197
  if expression.args.get("recursive"):
1197
1198
  self.unsupported("Recursive CTEs are unsupported")
1198
- expression.args["recursive"] = False
1199
+ expression.set("recursive", False)
1199
1200
  return self.with_sql(expression)
1200
1201
 
1201
1202
 
@@ -706,7 +706,6 @@ class DuckDB(Dialect):
706
706
  exp.GenerateDateArray: _generate_datetime_array_sql,
707
707
  exp.GenerateTimestampArray: _generate_datetime_array_sql,
708
708
  exp.GroupConcat: lambda self, e: groupconcat_sql(self, e, within_group=False),
709
- exp.HexString: lambda self, e: self.hexstring_sql(e, binary_function_repr="FROM_HEX"),
710
709
  exp.Explode: rename_func("UNNEST"),
711
710
  exp.IntDiv: lambda self, e: self.binary(e, "//"),
712
711
  exp.IsInf: rename_func("ISINF"),
@@ -1039,8 +1038,8 @@ class DuckDB(Dialect):
1039
1038
  if isinstance(expression.this, exp.Unnest):
1040
1039
  return super().join_sql(expression.on(exp.true()))
1041
1040
 
1042
- expression.args.pop("side", None)
1043
- expression.args.pop("kind", None)
1041
+ expression.set("side", None)
1042
+ expression.set("kind", None)
1044
1043
 
1045
1044
  return super().join_sql(expression)
1046
1045
 
@@ -1301,3 +1300,17 @@ class DuckDB(Dialect):
1301
1300
  return self.func("FORMAT", "'{}'", expression.expressions[0])
1302
1301
 
1303
1302
  return self.function_fallback_sql(expression)
1303
+
1304
+ def hexstring_sql(
1305
+ self, expression: exp.HexString, binary_function_repr: t.Optional[str] = None
1306
+ ) -> str:
1307
+ from_hex = super().hexstring_sql(expression, binary_function_repr="FROM_HEX")
1308
+
1309
+ if expression.args.get("is_integer"):
1310
+ return from_hex
1311
+
1312
+ # `from_hex` has transpiled x'ABCD' (BINARY) to DuckDB's '\xAB\xCD' (BINARY)
1313
+ # `to_hex` & CASTing transforms it to "ABCD" (BINARY) to match representation
1314
+ to_hex = exp.cast(self.func("TO_HEX", from_hex), exp.DataType.Type.BLOB)
1315
+
1316
+ return self.sql(to_hex)
@@ -67,7 +67,7 @@ def _date_add_sql(kind: str) -> t.Callable[[Postgres.Generator, DATE_ADD_OR_SUB]
67
67
 
68
68
  e = self._simplify_unless_literal(expression.expression)
69
69
  if isinstance(e, exp.Literal):
70
- e.args["is_string"] = True
70
+ e.set("is_string", True)
71
71
  elif e.is_number:
72
72
  e = exp.Literal.string(e.to_py())
73
73
  else:
@@ -571,8 +571,13 @@ class Snowflake(Dialect):
571
571
  exp.Degrees,
572
572
  exp.Exp,
573
573
  exp.Sin,
574
+ exp.Sinh,
574
575
  exp.Tan,
576
+ exp.Tanh,
575
577
  exp.Asin,
578
+ exp.Asinh,
579
+ exp.Atan,
580
+ exp.Atan2,
576
581
  exp.Atanh,
577
582
  exp.Cbrt,
578
583
  },
@@ -671,6 +676,7 @@ class Snowflake(Dialect):
671
676
  exp.Stuff,
672
677
  exp.Substring,
673
678
  exp.Round,
679
+ exp.Ceil,
674
680
  )
675
681
  },
676
682
  **{
@@ -1219,7 +1219,8 @@ class TSQL(Dialect):
1219
1219
 
1220
1220
  def create_sql(self, expression: exp.Create) -> str:
1221
1221
  kind = expression.kind
1222
- exists = expression.args.pop("exists", None)
1222
+ exists = expression.args.get("exists")
1223
+ expression.set("exists", None)
1223
1224
 
1224
1225
  like_property = expression.find(exp.LikeProperty)
1225
1226
  if like_property:
@@ -1008,8 +1008,8 @@ class Expression(metaclass=_Expression):
1008
1008
 
1009
1009
  def div(self, other: ExpOrStr, typed: bool = False, safe: bool = False) -> Div:
1010
1010
  div = self._binop(Div, other)
1011
- div.args["typed"] = typed
1012
- div.args["safe"] = safe
1011
+ div.set("typed", typed)
1012
+ div.set("safe", safe)
1013
1013
  return div
1014
1014
 
1015
1015
  def asc(self, nulls_first: bool = True) -> Ordered:
@@ -1727,6 +1727,7 @@ class CTE(DerivedTable):
1727
1727
  "alias": True,
1728
1728
  "scalar": False,
1729
1729
  "materialized": False,
1730
+ "key_expressions": False,
1730
1731
  }
1731
1732
 
1732
1733
 
@@ -2386,6 +2387,7 @@ class Insert(DDL, DML):
2386
2387
  "partition": False,
2387
2388
  "settings": False,
2388
2389
  "source": False,
2390
+ "default": False,
2389
2391
  }
2390
2392
 
2391
2393
  def with_(
@@ -5560,6 +5562,10 @@ class Tan(Func):
5560
5562
  pass
5561
5563
 
5562
5564
 
5565
+ class Tanh(Func):
5566
+ pass
5567
+
5568
+
5563
5569
  class Degrees(Func):
5564
5570
  pass
5565
5571
 
@@ -7201,6 +7207,10 @@ class VectorSearch(Func):
7201
7207
  }
7202
7208
 
7203
7209
 
7210
+ class Pi(Func):
7211
+ arg_types = {}
7212
+
7213
+
7204
7214
  class Pow(Binary, Func):
7205
7215
  _sql_names = ["POWER", "POW"]
7206
7216
 
@@ -1332,7 +1332,10 @@ class Generator(metaclass=_Generator):
1332
1332
  elif materialized:
1333
1333
  materialized = "MATERIALIZED "
1334
1334
 
1335
- return f"{alias_sql} AS {materialized or ''}{self.wrap(expression)}"
1335
+ key_expressions = self.expressions(expression, key="key_expressions", flat=True)
1336
+ key_expressions = f" USING KEY ({key_expressions})" if key_expressions else ""
1337
+
1338
+ return f"{alias_sql}{key_expressions} AS {materialized or ''}{self.wrap(expression)}"
1336
1339
 
1337
1340
  def tablealias_sql(self, expression: exp.TableAlias) -> str:
1338
1341
  alias = self.sql(expression, "this")
@@ -1478,7 +1481,7 @@ class Generator(metaclass=_Generator):
1478
1481
  def delete_sql(self, expression: exp.Delete) -> str:
1479
1482
  this = self.sql(expression, "this")
1480
1483
  this = f" FROM {this}" if this else ""
1481
- using = self.sql(expression, "using")
1484
+ using = self.expressions(expression, key="using")
1482
1485
  using = f" USING {using}" if using else ""
1483
1486
  cluster = self.sql(expression, "cluster")
1484
1487
  cluster = f" {cluster}" if cluster else ""
@@ -1952,10 +1955,11 @@ class Generator(metaclass=_Generator):
1952
1955
  on_conflict = self.sql(expression, "conflict")
1953
1956
  on_conflict = f" {on_conflict}" if on_conflict else ""
1954
1957
  by_name = " BY NAME" if expression.args.get("by_name") else ""
1958
+ default_values = "DEFAULT VALUES" if expression.args.get("default") else ""
1955
1959
  returning = self.sql(expression, "returning")
1956
1960
 
1957
1961
  if self.RETURNING_END:
1958
- expression_sql = f"{expression_sql}{on_conflict}{returning}"
1962
+ expression_sql = f"{expression_sql}{on_conflict}{default_values}{returning}"
1959
1963
  else:
1960
1964
  expression_sql = f"{returning}{expression_sql}{on_conflict}"
1961
1965
 
@@ -162,7 +162,7 @@ def _pop_table_column_aliases(derived_tables: t.List[exp.CTE | exp.Subquery]) ->
162
162
  continue
163
163
  table_alias = derived_table.args.get("alias")
164
164
  if table_alias:
165
- table_alias.args.pop("columns", None)
165
+ table_alias.set("columns", None)
166
166
 
167
167
 
168
168
  def _expand_using(scope: Scope, resolver: Resolver) -> t.Dict[str, t.Any]:
@@ -239,7 +239,7 @@ def _expand_using(scope: Scope, resolver: Resolver) -> t.Dict[str, t.Any]:
239
239
  if join_table not in tables:
240
240
  tables[join_table] = None
241
241
 
242
- join.args.pop("using")
242
+ join.set("using", None)
243
243
  join.set("on", exp.and_(*conditions, copy=False))
244
244
 
245
245
  if column_tables:
@@ -72,7 +72,8 @@ def qualify_tables(
72
72
  if isinstance(derived_table, exp.Subquery):
73
73
  unnested = derived_table.unnest()
74
74
  if isinstance(unnested, exp.Table):
75
- joins = unnested.args.pop("joins", None)
75
+ joins = unnested.args.get("joins")
76
+ unnested.set("joins", None)
76
77
  derived_table.this.replace(exp.select("*").from_(unnested.copy(), copy=False))
77
78
  derived_table.this.set("joins", joins)
78
79
 
@@ -189,7 +189,7 @@ def decorrelate(select, parent_select, external_columns, next_alias_name):
189
189
  # exists queries should not have any selects as it only checks if there are any rows
190
190
  # all selects will be added by the optimizer and only used for join keys
191
191
  if isinstance(parent_predicate, exp.Exists):
192
- select.args["expressions"] = []
192
+ select.set("expressions", [])
193
193
 
194
194
  for key, alias in key_aliases.items():
195
195
  if key in group_by:
@@ -805,6 +805,7 @@ class Parser(metaclass=_Parser):
805
805
  EXPRESSION_PARSERS = {
806
806
  exp.Cluster: lambda self: self._parse_sort(exp.Cluster, TokenType.CLUSTER_BY),
807
807
  exp.Column: lambda self: self._parse_column(),
808
+ exp.ColumnDef: lambda self: self._parse_column_def(self._parse_column()),
808
809
  exp.Condition: lambda self: self._parse_assignment(),
809
810
  exp.DataType: lambda self: self._parse_types(allow_identifiers=False, schema=True),
810
811
  exp.Expression: lambda self: self._parse_expression(),
@@ -2962,6 +2963,7 @@ class Parser(metaclass=_Parser):
2962
2963
  where=self._match_pair(TokenType.REPLACE, TokenType.WHERE) and self._parse_assignment(),
2963
2964
  partition=self._match(TokenType.PARTITION_BY) and self._parse_partitioned_by(),
2964
2965
  settings=self._match_text_seq("SETTINGS") and self._parse_settings_property(),
2966
+ default=self._match_text_seq("DEFAULT", "VALUES"),
2965
2967
  expression=self._parse_derived_table_values() or self._parse_ddl_select(),
2966
2968
  conflict=self._parse_on_conflict(),
2967
2969
  returning=returning or self._parse_returning(),
@@ -3110,7 +3112,8 @@ class Parser(metaclass=_Parser):
3110
3112
  exp.Delete,
3111
3113
  tables=tables,
3112
3114
  this=self._match(TokenType.FROM) and self._parse_table(joins=True),
3113
- using=self._match(TokenType.USING) and self._parse_table(joins=True),
3115
+ using=self._match(TokenType.USING)
3116
+ and self._parse_csv(lambda: self._parse_table(joins=True)),
3114
3117
  cluster=self._match(TokenType.ON) and self._parse_on_property(),
3115
3118
  where=self._parse_where(),
3116
3119
  returning=returning or self._parse_returning(),
@@ -3434,6 +3437,10 @@ class Parser(metaclass=_Parser):
3434
3437
  if not alias or not alias.this:
3435
3438
  self.raise_error("Expected CTE to have alias")
3436
3439
 
3440
+ key_expressions = (
3441
+ self._parse_wrapped_id_vars() if self._match_text_seq("USING", "KEY") else None
3442
+ )
3443
+
3437
3444
  if not self._match(TokenType.ALIAS) and not self.OPTIONAL_ALIAS_TOKEN_CTE:
3438
3445
  self._retreat(index)
3439
3446
  return None
@@ -3452,6 +3459,7 @@ class Parser(metaclass=_Parser):
3452
3459
  this=self._parse_wrapped(self._parse_statement),
3453
3460
  alias=alias,
3454
3461
  materialized=materialized,
3462
+ key_expressions=key_expressions,
3455
3463
  comments=comments,
3456
3464
  )
3457
3465
 
@@ -3566,7 +3574,8 @@ class Parser(metaclass=_Parser):
3566
3574
 
3567
3575
  this.set(key, expression)
3568
3576
  if key == "limit":
3569
- offset = expression.args.pop("offset", None)
3577
+ offset = expression.args.get("offset")
3578
+ expression.set("offset", None)
3570
3579
 
3571
3580
  if offset:
3572
3581
  offset = exp.Offset(expression=offset)
@@ -5266,8 +5275,8 @@ class Parser(metaclass=_Parser):
5266
5275
  this = self.expression(klass, this=this, comments=comments, expression=expression)
5267
5276
 
5268
5277
  if isinstance(this, exp.Div):
5269
- this.args["typed"] = self.dialect.TYPED_DIVISION
5270
- this.args["safe"] = self.dialect.SAFE_DIVISION
5278
+ this.set("typed", self.dialect.TYPED_DIVISION)
5279
+ this.set("safe", self.dialect.SAFE_DIVISION)
5271
5280
 
5272
5281
  return this
5273
5282
 
@@ -650,8 +650,8 @@ def eliminate_full_outer_join(expression: exp.Expression) -> exp.Expression:
650
650
  anti_join_clause = exp.select("1").from_(expression.args["from"]).where(join_conditions)
651
651
  expression_copy.args["joins"][index].set("side", "right")
652
652
  expression_copy = expression_copy.where(exp.Exists(this=anti_join_clause).not_())
653
- expression_copy.args.pop("with", None) # remove CTEs from RIGHT side
654
- expression.args.pop("order", None) # remove order by from LEFT side
653
+ expression_copy.set("with", None) # remove CTEs from RIGHT side
654
+ expression.set("order", None) # remove order by from LEFT side
655
655
 
656
656
  return exp.union(expression, expression_copy, copy=False, distinct=False)
657
657
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 27.25.2
3
+ Version: 27.26.0
4
4
  Summary: An easily customizable SQL parser and transpiler
5
5
  Author-email: Toby Mao <toby.mao@gmail.com>
6
6
  License-Expression: MIT
@@ -1834,6 +1834,14 @@ WHERE
1834
1834
  self.validate_identity("SELECT TRANSLATE(MODEL, 'in', 't') FROM (SELECT 'input' AS MODEL)")
1835
1835
  self.validate_identity("SELECT GRANT FROM (SELECT 'input' AS GRANT)")
1836
1836
 
1837
+ self.validate_all(
1838
+ "SELECT 0xA",
1839
+ write={
1840
+ "bigquery": "SELECT 0xA",
1841
+ "duckdb": "SELECT 10",
1842
+ },
1843
+ )
1844
+
1837
1845
  def test_errors(self):
1838
1846
  with self.assertRaises(ParseError):
1839
1847
  self.parse_one("SELECT * FROM a - b.c.d2")
@@ -292,6 +292,7 @@ class TestDuckDB(Validator):
292
292
  self.validate_identity(
293
293
  "ARG_MAX(keyword_name, keyword_category, 3 ORDER BY keyword_name DESC)"
294
294
  )
295
+ self.validate_identity("INSERT INTO t DEFAULT VALUES RETURNING (c1)")
295
296
  self.validate_identity("CREATE TABLE notes (watermark TEXT)")
296
297
  self.validate_identity("SELECT LIST_TRANSFORM([5, NULL, 6], LAMBDA x : COALESCE(x, 0) + 1)")
297
298
  self.validate_identity("SELECT LIST_TRANSFORM(nbr, LAMBDA x : x + 1) FROM article AS a")
@@ -1094,6 +1095,10 @@ class TestDuckDB(Validator):
1094
1095
 
1095
1096
  self.validate_identity("SELECT row")
1096
1097
 
1098
+ self.validate_identity(
1099
+ "DELETE FROM t USING (VALUES (1)) AS t1(c), (VALUES (1), (2)) AS t2(c) WHERE t.c = t1.c AND t.c = t2.c"
1100
+ )
1101
+
1097
1102
  def test_array_index(self):
1098
1103
  with self.assertLogs(helper_logger) as cm:
1099
1104
  self.validate_all(
@@ -1850,3 +1855,11 @@ class TestDuckDB(Validator):
1850
1855
  self.validate_identity("FORCE INSTALL httpfs FROM community")
1851
1856
  self.validate_identity("FORCE INSTALL httpfs FROM 'https://extensions.duckdb.org'")
1852
1857
  self.validate_identity("FORCE CHECKPOINT db", check_command_warning=True)
1858
+
1859
+ def test_cte_using_key(self):
1860
+ self.validate_identity(
1861
+ "WITH RECURSIVE tbl(a, b) USING KEY (a) AS (SELECT a, b FROM (VALUES (1, 3), (2, 4)) AS t(a, b) UNION SELECT a + 1, b FROM tbl WHERE a < 3) SELECT * FROM tbl"
1862
+ )
1863
+ self.validate_identity(
1864
+ "WITH RECURSIVE tbl(a, b) USING KEY (a, b) AS (SELECT a, b FROM (VALUES (1, 3), (2, 4)) AS t(a, b) UNION SELECT a + 1, b FROM tbl WHERE a < 3) SELECT * FROM tbl"
1865
+ )
@@ -450,7 +450,7 @@ class TestMySQL(Validator):
450
450
  "clickhouse": UnsupportedError,
451
451
  "databricks": "SELECT X'CC'",
452
452
  "drill": "SELECT 204",
453
- "duckdb": "SELECT FROM_HEX('CC')",
453
+ "duckdb": "SELECT CAST(HEX(FROM_HEX('CC')) AS VARBINARY)",
454
454
  "hive": "SELECT 204",
455
455
  "mysql": "SELECT x'CC'",
456
456
  "oracle": "SELECT 204",
@@ -471,7 +471,7 @@ class TestMySQL(Validator):
471
471
  "clickhouse": UnsupportedError,
472
472
  "databricks": "SELECT X'0000CC'",
473
473
  "drill": "SELECT 204",
474
- "duckdb": "SELECT FROM_HEX('0000CC')",
474
+ "duckdb": "SELECT CAST(HEX(FROM_HEX('0000CC')) AS VARBINARY)",
475
475
  "hive": "SELECT 204",
476
476
  "mysql": "SELECT x'0000CC'",
477
477
  "oracle": "SELECT 204",
@@ -21,6 +21,7 @@ class TestSnowflake(Validator):
21
21
  self.validate_identity("SELECT GET(a, b)")
22
22
  self.validate_identity("SELECT TAN(x)")
23
23
  self.validate_identity("SELECT COS(x)")
24
+ self.validate_identity("SELECT SINH(1.5)")
24
25
  self.validate_identity("SELECT MOD(x, y)", "SELECT x % y")
25
26
  self.validate_identity("SELECT ROUND(x)")
26
27
  self.validate_identity("SELECT ROUND(123.456, -1)")
@@ -60,14 +61,22 @@ class TestSnowflake(Validator):
60
61
  self.validate_identity("SELECT SOUNDEX_P123(column_name)")
61
62
  self.validate_identity("SELECT ABS(x)")
62
63
  self.validate_identity("SELECT ASIN(0.5)")
64
+ self.validate_identity("SELECT ASINH(0.5)")
65
+ self.validate_identity("SELECT ATAN(0.5)")
66
+ self.validate_identity("SELECT ATAN2(0.5, 0.3)")
63
67
  self.validate_identity("SELECT ATANH(0.5)")
64
68
  self.validate_identity("SELECT CBRT(27.0)")
69
+ self.validate_identity("SELECT POW(2, 3)", "SELECT POWER(2, 3)")
70
+ self.validate_identity("SELECT POW(2.5, 3.0)", "SELECT POWER(2.5, 3.0)")
71
+ self.validate_identity("SELECT SQUARE(2.5)", "SELECT POWER(2.5, 2)")
65
72
  self.validate_identity("SELECT SIGN(x)")
66
73
  self.validate_identity("SELECT COSH(1.5)")
74
+ self.validate_identity("SELECT TANH(0.5)")
67
75
  self.validate_identity("SELECT JAROWINKLER_SIMILARITY('hello', 'world')")
68
76
  self.validate_identity("SELECT TRANSLATE(column_name, 'abc', '123')")
69
77
  self.validate_identity("SELECT UNICODE(column_name)")
70
78
  self.validate_identity("SELECT SPLIT_PART('11.22.33', '.', 1)")
79
+ self.validate_identity("SELECT PI()")
71
80
  self.validate_identity("SELECT DEGREES(PI() / 3)")
72
81
  self.validate_identity("SELECT DEGREES(1)")
73
82
  self.validate_identity("PARSE_URL('https://example.com/path')")
@@ -354,6 +363,12 @@ class TestSnowflake(Validator):
354
363
  "SELECT {fn CEILING(5.3)}",
355
364
  "SELECT CEIL(5.3)",
356
365
  )
366
+ self.validate_identity(
367
+ "SELECT CEIL(3.14)",
368
+ )
369
+ self.validate_identity(
370
+ "SELECT CEIL(3.14, 1)",
371
+ )
357
372
  self.validate_identity(
358
373
  "CAST(x AS BYTEINT)",
359
374
  "CAST(x AS INT)",
@@ -1484,6 +1499,14 @@ class TestSnowflake(Validator):
1484
1499
  )
1485
1500
  self.validate_identity("SELECT ARRAY_CONTAINS(1, [1])")
1486
1501
 
1502
+ self.validate_all(
1503
+ "SELECT x'ABCD'",
1504
+ write={
1505
+ "snowflake": "SELECT x'ABCD'",
1506
+ "duckdb": "SELECT CAST(HEX(FROM_HEX('ABCD')) AS VARBINARY)",
1507
+ },
1508
+ )
1509
+
1487
1510
  def test_null_treatment(self):
1488
1511
  self.validate_all(
1489
1512
  r"SELECT FIRST_VALUE(TABLE1.COLUMN1) OVER (PARTITION BY RANDOM_COLUMN1, RANDOM_COLUMN2 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS MY_ALIAS FROM TABLE1",
@@ -929,6 +929,7 @@ SELECT UTC_TIME
929
929
  SELECT UTC_TIMESTAMP
930
930
  SELECT SIN(x)
931
931
  SELECT SINH(x)
932
+ SELECT TANH(x)
932
933
  SELECT COSINE_DISTANCE(v1, v2)
933
934
  SELECT EUCLIDEAN_DISTANCE(v1, v2)
934
935
  FOO(values.c)
@@ -1547,6 +1547,18 @@ DOUBLE;
1547
1547
  ASIN(tbl.double_col);
1548
1548
  DOUBLE;
1549
1549
 
1550
+ # dialect: snowflake
1551
+ ASINH(tbl.double_col);
1552
+ DOUBLE;
1553
+
1554
+ # dialect: snowflake
1555
+ ATAN(tbl.double_col);
1556
+ DOUBLE;
1557
+
1558
+ # dialect: snowflake
1559
+ ATAN2(tbl.double_col, tbl.double_col);
1560
+ DOUBLE;
1561
+
1550
1562
  # dialect: snowflake
1551
1563
  ATANH(tbl.double_col);
1552
1564
  DOUBLE;
@@ -1631,6 +1643,22 @@ INT;
1631
1643
  CHARINDEX('world', 'hello world', 1);
1632
1644
  INT;
1633
1645
 
1646
+ # dialect: snowflake
1647
+ CEIL(3.14);
1648
+ DOUBLE;
1649
+
1650
+ # dialect: snowflake
1651
+ CEIL(3.14::FLOAT, 1);
1652
+ FLOAT;
1653
+
1654
+ # dialect: snowflake
1655
+ CEIL(3.14, 1);
1656
+ DOUBLE;
1657
+
1658
+ # dialect: snowflake
1659
+ CEIL(10::NUMERIC);
1660
+ NUMBER;
1661
+
1634
1662
  # dialect: snowflake
1635
1663
  CHAR(65);
1636
1664
  VARCHAR;
@@ -1919,6 +1947,14 @@ INT;
1919
1947
  POSITION('abc', 'abcdef', 1);
1920
1948
  INT;
1921
1949
 
1950
+ # dialect: snowflake
1951
+ PI();
1952
+ DOUBLE;
1953
+
1954
+ # dialect: snowflake
1955
+ POW(tbl.double_col, 2);
1956
+ DOUBLE;
1957
+
1922
1958
  # dialect: snowflake
1923
1959
  LOWER(tbl.str_col);
1924
1960
  VARCHAR;
@@ -2131,6 +2167,14 @@ BIGINT;
2131
2167
  ROUND(tbl.double_col, 0, 'HALF_TO_EVEN');
2132
2168
  DOUBLE;
2133
2169
 
2170
+ # dialect: snowflake
2171
+ SQUARE(tbl.double_col);
2172
+ DOUBLE;
2173
+
2174
+ # dialect: snowflake
2175
+ TANH(tbl.double_col);
2176
+ DOUBLE;
2177
+
2134
2178
  # dialect: snowflake
2135
2179
  RIGHT('hello world', 5);
2136
2180
  VARCHAR;
@@ -2251,6 +2295,14 @@ VARCHAR;
2251
2295
  SIN(tbl.double_col);
2252
2296
  DOUBLE;
2253
2297
 
2298
+ # dialect: snowflake
2299
+ SINH(1);
2300
+ DOUBLE;
2301
+
2302
+ # dialect: snowflake
2303
+ SINH(1.5);
2304
+ DOUBLE;
2305
+
2254
2306
  # dialect: snowflake
2255
2307
  SIGN(tbl.double_col);
2256
2308
  INT;
@@ -40,6 +40,8 @@ class TestParser(unittest.TestCase):
40
40
  "Failed to parse 'SELECT * FROM tbl' into <class 'sqlglot.expressions.Table'>",
41
41
  )
42
42
 
43
+ self.assertIsInstance(parse_one("foo INT NOT NULL", into=exp.ColumnDef), exp.ColumnDef)
44
+
43
45
  def test_parse_into_error(self):
44
46
  expected_message = "Failed to parse 'SELECT 1;' into [<class 'sqlglot.expressions.From'>]"
45
47
  expected_errors = [
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes