sqlglot 27.18.0__tar.gz → 27.19.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.18.0 → sqlglot-27.19.0}/CHANGELOG.md +43 -0
  2. {sqlglot-27.18.0 → sqlglot-27.19.0}/PKG-INFO +1 -1
  3. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/_version.py +3 -3
  4. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/bigquery.py +25 -9
  5. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/snowflake.py +10 -0
  6. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/expressions.py +14 -0
  7. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/parser.py +2 -0
  8. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot.egg-info/PKG-INFO +1 -1
  9. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_bigquery.py +1 -0
  10. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_databricks.py +4 -0
  11. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_snowflake.py +25 -0
  12. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/annotate_functions.sql +60 -0
  13. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_parser.py +21 -0
  14. {sqlglot-27.18.0 → sqlglot-27.19.0}/.gitignore +0 -0
  15. {sqlglot-27.18.0 → sqlglot-27.19.0}/.gitpod.yml +0 -0
  16. {sqlglot-27.18.0 → sqlglot-27.19.0}/.pre-commit-config.yaml +0 -0
  17. {sqlglot-27.18.0 → sqlglot-27.19.0}/CONTRIBUTING.md +0 -0
  18. {sqlglot-27.18.0 → sqlglot-27.19.0}/LICENSE +0 -0
  19. {sqlglot-27.18.0 → sqlglot-27.19.0}/MANIFEST.in +0 -0
  20. {sqlglot-27.18.0 → sqlglot-27.19.0}/Makefile +0 -0
  21. {sqlglot-27.18.0 → sqlglot-27.19.0}/README.md +0 -0
  22. {sqlglot-27.18.0 → sqlglot-27.19.0}/pyproject.toml +0 -0
  23. {sqlglot-27.18.0 → sqlglot-27.19.0}/setup.cfg +0 -0
  24. {sqlglot-27.18.0 → sqlglot-27.19.0}/setup.py +0 -0
  25. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/__init__.py +0 -0
  26. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/__main__.py +0 -0
  27. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/_typing.py +0 -0
  28. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/__init__.py +0 -0
  29. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/athena.py +0 -0
  30. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/clickhouse.py +0 -0
  31. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/databricks.py +0 -0
  32. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/dialect.py +0 -0
  33. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/doris.py +0 -0
  34. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/dremio.py +0 -0
  35. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/drill.py +0 -0
  36. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/druid.py +0 -0
  37. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/duckdb.py +0 -0
  38. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/dune.py +0 -0
  39. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/exasol.py +0 -0
  40. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/fabric.py +0 -0
  41. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/hive.py +0 -0
  42. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/materialize.py +0 -0
  43. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/mysql.py +0 -0
  44. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/oracle.py +0 -0
  45. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/postgres.py +0 -0
  46. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/presto.py +0 -0
  47. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/prql.py +0 -0
  48. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/redshift.py +0 -0
  49. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/risingwave.py +0 -0
  50. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/singlestore.py +0 -0
  51. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/solr.py +0 -0
  52. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/spark.py +0 -0
  53. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/spark2.py +0 -0
  54. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/sqlite.py +0 -0
  55. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/starrocks.py +0 -0
  56. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/tableau.py +0 -0
  57. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/teradata.py +0 -0
  58. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/trino.py +0 -0
  59. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/dialects/tsql.py +0 -0
  60. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/diff.py +0 -0
  61. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/errors.py +0 -0
  62. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/executor/__init__.py +0 -0
  63. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/executor/context.py +0 -0
  64. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/executor/env.py +0 -0
  65. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/executor/python.py +0 -0
  66. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/executor/table.py +0 -0
  67. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/generator.py +0 -0
  68. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/helper.py +0 -0
  69. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/jsonpath.py +0 -0
  70. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/lineage.py +0 -0
  71. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/__init__.py +0 -0
  72. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/annotate_types.py +0 -0
  73. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/canonicalize.py +0 -0
  74. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/eliminate_ctes.py +0 -0
  75. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/eliminate_joins.py +0 -0
  76. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/eliminate_subqueries.py +0 -0
  77. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/isolate_table_selects.py +0 -0
  78. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/merge_subqueries.py +0 -0
  79. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/normalize.py +0 -0
  80. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/normalize_identifiers.py +0 -0
  81. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/optimize_joins.py +0 -0
  82. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/optimizer.py +0 -0
  83. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/pushdown_predicates.py +0 -0
  84. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/pushdown_projections.py +0 -0
  85. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/qualify.py +0 -0
  86. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/qualify_columns.py +0 -0
  87. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/qualify_tables.py +0 -0
  88. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/scope.py +0 -0
  89. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/simplify.py +0 -0
  90. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/optimizer/unnest_subqueries.py +0 -0
  91. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/planner.py +0 -0
  92. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/py.typed +0 -0
  93. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/schema.py +0 -0
  94. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/serde.py +0 -0
  95. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/time.py +0 -0
  96. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/tokens.py +0 -0
  97. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/transforms.py +0 -0
  98. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot/trie.py +0 -0
  99. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot.egg-info/SOURCES.txt +0 -0
  100. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot.egg-info/dependency_links.txt +0 -0
  101. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot.egg-info/requires.txt +0 -0
  102. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot.egg-info/top_level.txt +0 -0
  103. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglot.png +0 -0
  104. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/Cargo.lock +0 -0
  105. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/Cargo.toml +0 -0
  106. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/benches/dialect_settings.json +0 -0
  107. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/benches/long.rs +0 -0
  108. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/benches/token_type_settings.json +0 -0
  109. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/benches/tokenizer_dialect_settings.json +0 -0
  110. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/benches/tokenizer_settings.json +0 -0
  111. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/pyproject.toml +0 -0
  112. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/src/lib.rs +0 -0
  113. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/src/settings.rs +0 -0
  114. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/src/token.rs +0 -0
  115. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/src/tokenizer.rs +0 -0
  116. {sqlglot-27.18.0 → sqlglot-27.19.0}/sqlglotrs/src/trie.rs +0 -0
  117. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/__init__.py +0 -0
  118. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/__init__.py +0 -0
  119. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_athena.py +0 -0
  120. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_clickhouse.py +0 -0
  121. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_dialect.py +0 -0
  122. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_doris.py +0 -0
  123. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_dremio.py +0 -0
  124. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_drill.py +0 -0
  125. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_druid.py +0 -0
  126. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_duckdb.py +0 -0
  127. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_dune.py +0 -0
  128. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_exasol.py +0 -0
  129. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_fabric.py +0 -0
  130. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_hive.py +0 -0
  131. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_materialize.py +0 -0
  132. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_mysql.py +0 -0
  133. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_oracle.py +0 -0
  134. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_pipe_syntax.py +0 -0
  135. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_postgres.py +0 -0
  136. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_presto.py +0 -0
  137. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_prql.py +0 -0
  138. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_redshift.py +0 -0
  139. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_risingwave.py +0 -0
  140. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_singlestore.py +0 -0
  141. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_solr.py +0 -0
  142. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_spark.py +0 -0
  143. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_sqlite.py +0 -0
  144. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_starrocks.py +0 -0
  145. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_tableau.py +0 -0
  146. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_teradata.py +0 -0
  147. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_trino.py +0 -0
  148. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/dialects/test_tsql.py +0 -0
  149. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/identity.sql +0 -0
  150. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/jsonpath/LICENSE +0 -0
  151. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/jsonpath/cts.json +0 -0
  152. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/annotate_types.sql +0 -0
  153. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/canonicalize.sql +0 -0
  154. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/eliminate_ctes.sql +0 -0
  155. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/eliminate_joins.sql +0 -0
  156. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/eliminate_subqueries.sql +0 -0
  157. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/isolate_table_selects.sql +0 -0
  158. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/merge_subqueries.sql +0 -0
  159. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/normalize.sql +0 -0
  160. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/normalize_identifiers.sql +0 -0
  161. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/optimize_joins.sql +0 -0
  162. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/optimizer.sql +0 -0
  163. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/pushdown_cte_alias_columns.sql +0 -0
  164. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/pushdown_predicates.sql +0 -0
  165. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/pushdown_projections.sql +0 -0
  166. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/qualify_columns.sql +0 -0
  167. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/qualify_columns__invalid.sql +0 -0
  168. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/qualify_columns__with_invisible.sql +0 -0
  169. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/qualify_columns_ddl.sql +0 -0
  170. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/qualify_tables.sql +0 -0
  171. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/quote_identifiers.sql +0 -0
  172. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/simplify.sql +0 -0
  173. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/call_center.csv.gz +0 -0
  174. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/catalog_page.csv.gz +0 -0
  175. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/catalog_returns.csv.gz +0 -0
  176. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/catalog_sales.csv.gz +0 -0
  177. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/customer.csv.gz +0 -0
  178. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/customer_address.csv.gz +0 -0
  179. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/customer_demographics.csv.gz +0 -0
  180. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/date_dim.csv.gz +0 -0
  181. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/household_demographics.csv.gz +0 -0
  182. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/income_band.csv.gz +0 -0
  183. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/inventory.csv.gz +0 -0
  184. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/item.csv.gz +0 -0
  185. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/promotion.csv.gz +0 -0
  186. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/reason.csv.gz +0 -0
  187. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/ship_mode.csv.gz +0 -0
  188. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/store.csv.gz +0 -0
  189. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/store_returns.csv.gz +0 -0
  190. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/store_sales.csv.gz +0 -0
  191. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/time_dim.csv.gz +0 -0
  192. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/tpc-ds.sql +0 -0
  193. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/warehouse.csv.gz +0 -0
  194. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/web_page.csv.gz +0 -0
  195. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/web_returns.csv.gz +0 -0
  196. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/web_sales.csv.gz +0 -0
  197. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-ds/web_site.csv.gz +0 -0
  198. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/customer.csv.gz +0 -0
  199. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/lineitem.csv.gz +0 -0
  200. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/nation.csv.gz +0 -0
  201. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/orders.csv.gz +0 -0
  202. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/part.csv.gz +0 -0
  203. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/partsupp.csv.gz +0 -0
  204. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/region.csv.gz +0 -0
  205. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/supplier.csv.gz +0 -0
  206. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/tpc-h/tpc-h.sql +0 -0
  207. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/optimizer/unnest_subqueries.sql +0 -0
  208. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/partial.sql +0 -0
  209. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/fixtures/pretty.sql +0 -0
  210. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/gen_fixtures.py +0 -0
  211. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/helpers.py +0 -0
  212. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_build.py +0 -0
  213. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_dialect_imports.py +0 -0
  214. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_diff.py +0 -0
  215. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_docs.py +0 -0
  216. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_executor.py +0 -0
  217. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_expressions.py +0 -0
  218. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_generator.py +0 -0
  219. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_helper.py +0 -0
  220. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_jsonpath.py +0 -0
  221. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_lineage.py +0 -0
  222. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_optimizer.py +0 -0
  223. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_schema.py +0 -0
  224. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_serde.py +0 -0
  225. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_time.py +0 -0
  226. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_tokens.py +0 -0
  227. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_transforms.py +0 -0
  228. {sqlglot-27.18.0 → sqlglot-27.19.0}/tests/test_transpile.py +0 -0
@@ -1,6 +1,48 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ ## [v27.18.0] - 2025-09-25
5
+ ### :boom: BREAKING CHANGES
6
+ - due to [`7f13eaf`](https://github.com/tobymao/sqlglot/commit/7f13eaf7769a3381a56c9209af590835be2f95cd) - Annotate type for snowflake DECOMPRESS_BINARY function *(PR [#5945](https://github.com/tobymao/sqlglot/pull/5945) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
7
+
8
+ Annotate type for snowflake DECOMPRESS_BINARY function (#5945)
9
+
10
+ - due to [`be12b29`](https://github.com/tobymao/sqlglot/commit/be12b29b5a7bd6d6e09dbd8c17086bd77c19abc0) - Annotate type for snowflake DECOMPRESS_STRING function *(PR [#5947](https://github.com/tobymao/sqlglot/pull/5947) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
11
+
12
+ Annotate type for snowflake DECOMPRESS_STRING function (#5947)
13
+
14
+ - due to [`1573fef`](https://github.com/tobymao/sqlglot/commit/1573fefac27b5b1215e3d458f8ccf1b9dadbb772) - annotate types for Snowflake JAROWINKLER_SIMILARITY function *(PR [#5950](https://github.com/tobymao/sqlglot/pull/5950) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*:
15
+
16
+ annotate types for Snowflake JAROWINKLER_SIMILARITY function (#5950)
17
+
18
+ - due to [`883c6ab`](https://github.com/tobymao/sqlglot/commit/883c6abe589865f478d95604e8d670e57afd04af) - annotate type for Snowflake COLLATION function *(PR [#5939](https://github.com/tobymao/sqlglot/pull/5939) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*:
19
+
20
+ annotate type for Snowflake COLLATION function (#5939)
21
+
22
+
23
+ ### :sparkles: New Features
24
+ - [`7f13eaf`](https://github.com/tobymao/sqlglot/commit/7f13eaf7769a3381a56c9209af590835be2f95cd) - **optimizer**: Annotate type for snowflake DECOMPRESS_BINARY function *(PR [#5945](https://github.com/tobymao/sqlglot/pull/5945) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
25
+ - [`be12b29`](https://github.com/tobymao/sqlglot/commit/be12b29b5a7bd6d6e09dbd8c17086bd77c19abc0) - **optimizer**: Annotate type for snowflake DECOMPRESS_STRING function *(PR [#5947](https://github.com/tobymao/sqlglot/pull/5947) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
26
+ - [`a55fce5`](https://github.com/tobymao/sqlglot/commit/a55fce5310a50af132c5d06bb299fe3f025442c4) - **optimizer**: Annotate type for snowflake LPAD function *(PR [#5948](https://github.com/tobymao/sqlglot/pull/5948) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*
27
+ - [`05e07aa`](https://github.com/tobymao/sqlglot/commit/05e07aa740d7977a6b42ec15ae4fa9c2168a15f5) - **optimizer**: annotate type for Snowflake INSERT function *(PR [#5942](https://github.com/tobymao/sqlglot/pull/5942) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*
28
+ - [`6268e10`](https://github.com/tobymao/sqlglot/commit/6268e107a947badaa00508544f5389412806ecd0) - **solr**: initial dialect implementation *(PR [#5946](https://github.com/tobymao/sqlglot/pull/5946) by [@aadel](https://github.com/aadel))*
29
+ - [`1573fef`](https://github.com/tobymao/sqlglot/commit/1573fefac27b5b1215e3d458f8ccf1b9dadbb772) - **optimizer**: annotate types for Snowflake JAROWINKLER_SIMILARITY function *(PR [#5950](https://github.com/tobymao/sqlglot/pull/5950) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*
30
+ - [`883c6ab`](https://github.com/tobymao/sqlglot/commit/883c6abe589865f478d95604e8d670e57afd04af) - **optimizer**: annotate type for Snowflake COLLATION function *(PR [#5939](https://github.com/tobymao/sqlglot/pull/5939) by [@fivetran-BradfordPaskewitz](https://github.com/fivetran-BradfordPaskewitz))*
31
+ - [`627c18d`](https://github.com/tobymao/sqlglot/commit/627c18d7da6bf644bc14c0f17963dea0be20604a) - **mysql**: add valid INTERVAL units *(PR [#5951](https://github.com/tobymao/sqlglot/pull/5951) by [@geooo109](https://github.com/geooo109))*
32
+
33
+ ### :bug: Bug Fixes
34
+ - [`3846d4d`](https://github.com/tobymao/sqlglot/commit/3846d4dcdf8cbf8e90b2661083a567ab0547ad3c) - **solr**: properly support OR alternative operator *(commit by [@georgesittas](https://github.com/georgesittas))*
35
+ - [`df428d5`](https://github.com/tobymao/sqlglot/commit/df428d516113a47ae50d04cd50a250830589c072) - **parser**: interval identifier followed by END *(PR [#5944](https://github.com/tobymao/sqlglot/pull/5944) by [@geooo109](https://github.com/geooo109))*
36
+ - [`e178d16`](https://github.com/tobymao/sqlglot/commit/e178d1674a71e6f35a6acfa8f4a317f0fe2e4516) - **duckdb**: UNNEST as table *(PR [#5953](https://github.com/tobymao/sqlglot/pull/5953) by [@geooo109](https://github.com/geooo109))*
37
+ - :arrow_lower_right: *fixes issue [#5952](https://github.com/tobymao/sqlglot/issues/5952) opened by [@denis-komarov](https://github.com/denis-komarov)*
38
+ - [`24feb8e`](https://github.com/tobymao/sqlglot/commit/24feb8ee0bc43f3f14fd768c9a0d986355becea2) - **parser**: parse `UPDATE` clauses in any order *(PR [#5958](https://github.com/tobymao/sqlglot/pull/5958) by [@georgesittas](https://github.com/georgesittas))*
39
+ - :arrow_lower_right: *fixes issue [#5956](https://github.com/tobymao/sqlglot/issues/5956) opened by [@sfc-gh-clathrope](https://github.com/sfc-gh-clathrope)*
40
+ - [`980f99a`](https://github.com/tobymao/sqlglot/commit/980f99a4cc0613012a189ee5636af37ec736040c) - **snowflake**: properly generate inferred `STRUCT` data types *(PR [#5954](https://github.com/tobymao/sqlglot/pull/5954) by [@georgesittas](https://github.com/georgesittas))*
41
+
42
+ ### :wrench: Chores
43
+ - [`c18aaf8`](https://github.com/tobymao/sqlglot/commit/c18aaf80fd7375e89dfc8863da619d84f3257353) - cleanup *(commit by [@tobymao](https://github.com/tobymao))*
44
+
45
+
4
46
  ## [v27.17.0] - 2025-09-23
5
47
  ### :boom: BREAKING CHANGES
6
48
  - due to [`f4ad258`](https://github.com/tobymao/sqlglot/commit/f4ad25882951de4e4442dfd5189a56d5a1c5e630) - Annotate types for Snowflake BASE64_DECODE_BINARY function *(PR [#5917](https://github.com/tobymao/sqlglot/pull/5917) by [@fivetran-amrutabhimsenayachit](https://github.com/fivetran-amrutabhimsenayachit))*:
@@ -7477,3 +7519,4 @@ Changelog
7477
7519
  [v27.16.2]: https://github.com/tobymao/sqlglot/compare/v27.16.1...v27.16.2
7478
7520
  [v27.16.3]: https://github.com/tobymao/sqlglot/compare/v27.16.2...v27.16.3
7479
7521
  [v27.17.0]: https://github.com/tobymao/sqlglot/compare/v27.16.3...v27.17.0
7522
+ [v27.18.0]: https://github.com/tobymao/sqlglot/compare/v27.17.0...v27.18.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 27.18.0
3
+ Version: 27.19.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.18.0'
32
- __version_tuple__ = version_tuple = (27, 18, 0)
31
+ __version__ = version = '27.19.0'
32
+ __version_tuple__ = version_tuple = (27, 19, 0)
33
33
 
34
- __commit_id__ = commit_id = 'g980f99a4c'
34
+ __commit_id__ = commit_id = 'g1471306ed'
@@ -754,15 +754,31 @@ class BigQuery(Dialect):
754
754
  SUPPORTS_IMPLICIT_UNNEST = True
755
755
  JOINS_HAVE_EQUAL_PRECEDENCE = True
756
756
 
757
- # BigQuery does not allow ASC/DESC to be used as an identifier
758
- ID_VAR_TOKENS = parser.Parser.ID_VAR_TOKENS - {TokenType.ASC, TokenType.DESC}
759
- ALIAS_TOKENS = parser.Parser.ALIAS_TOKENS - {TokenType.ASC, TokenType.DESC}
760
- TABLE_ALIAS_TOKENS = parser.Parser.TABLE_ALIAS_TOKENS - {TokenType.ASC, TokenType.DESC}
761
- COMMENT_TABLE_ALIAS_TOKENS = parser.Parser.COMMENT_TABLE_ALIAS_TOKENS - {
762
- TokenType.ASC,
763
- TokenType.DESC,
764
- }
765
- UPDATE_ALIAS_TOKENS = parser.Parser.UPDATE_ALIAS_TOKENS - {TokenType.ASC, TokenType.DESC}
757
+ # BigQuery does not allow ASC/DESC to be used as an identifier, allows GRANT as an identifier
758
+ ID_VAR_TOKENS = {
759
+ *parser.Parser.ID_VAR_TOKENS,
760
+ TokenType.GRANT,
761
+ } - {TokenType.ASC, TokenType.DESC}
762
+
763
+ ALIAS_TOKENS = {
764
+ *parser.Parser.ALIAS_TOKENS,
765
+ TokenType.GRANT,
766
+ } - {TokenType.ASC, TokenType.DESC}
767
+
768
+ TABLE_ALIAS_TOKENS = {
769
+ *parser.Parser.TABLE_ALIAS_TOKENS,
770
+ TokenType.GRANT,
771
+ } - {TokenType.ASC, TokenType.DESC}
772
+
773
+ COMMENT_TABLE_ALIAS_TOKENS = {
774
+ *parser.Parser.COMMENT_TABLE_ALIAS_TOKENS,
775
+ TokenType.GRANT,
776
+ } - {TokenType.ASC, TokenType.DESC}
777
+
778
+ UPDATE_ALIAS_TOKENS = {
779
+ *parser.Parser.UPDATE_ALIAS_TOKENS,
780
+ TokenType.GRANT,
781
+ } - {TokenType.ASC, TokenType.DESC}
766
782
 
767
783
  FUNCTIONS = {
768
784
  **parser.Parser.FUNCTIONS,
@@ -532,10 +532,13 @@ class Snowflake(Dialect):
532
532
  exp.DataType.Type.INT: {
533
533
  *Dialect.TYPE_TO_EXPRESSIONS[exp.DataType.Type.INT],
534
534
  exp.Ascii,
535
+ exp.ByteLength,
535
536
  exp.Length,
537
+ exp.RtrimmedLength,
536
538
  exp.BitLength,
537
539
  exp.Levenshtein,
538
540
  exp.JarowinklerSimilarity,
541
+ exp.StrPosition,
539
542
  },
540
543
  exp.DataType.Type.VARCHAR: {
541
544
  *Dialect.TYPE_TO_EXPRESSIONS[exp.DataType.Type.VARCHAR],
@@ -579,6 +582,10 @@ class Snowflake(Dialect):
579
582
  exp.DataType.Type.ARRAY: {
580
583
  exp.Split,
581
584
  },
585
+ exp.DataType.Type.OBJECT: {
586
+ exp.ParseUrl,
587
+ exp.ParseIp,
588
+ },
582
589
  }
583
590
 
584
591
  ANNOTATORS = {
@@ -732,6 +739,9 @@ class Snowflake(Dialect):
732
739
  "NULLIFZERO": _build_if_from_nullifzero,
733
740
  "OBJECT_CONSTRUCT": _build_object_construct,
734
741
  "OCTET_LENGTH": exp.ByteLength.from_arg_list,
742
+ "PARSE_URL": lambda args: exp.ParseUrl(
743
+ this=seq_get(args, 0), permissive=seq_get(args, 1)
744
+ ),
735
745
  "REGEXP_EXTRACT_ALL": _build_regexp_extract(exp.RegexpExtractAll),
736
746
  "REGEXP_REPLACE": _build_regexp_replace,
737
747
  "REGEXP_SUBSTR": _build_regexp_extract(exp.RegexpExtract),
@@ -6888,6 +6888,16 @@ class ParseJSON(Func):
6888
6888
  arg_types = {"this": True, "expression": False, "safe": False}
6889
6889
 
6890
6890
 
6891
+ # Snowflake: https://docs.snowflake.com/en/sql-reference/functions/parse_url
6892
+ # Databricks: https://docs.databricks.com/aws/en/sql/language-manual/functions/parse_url
6893
+ class ParseUrl(Func):
6894
+ arg_types = {"this": True, "part_to_extract": False, "key": False, "permissive": False}
6895
+
6896
+
6897
+ class ParseIp(Func):
6898
+ arg_types = {"this": True, "type": True, "permissive": False}
6899
+
6900
+
6891
6901
  class ParseTime(Func):
6892
6902
  arg_types = {"this": True, "format": True}
6893
6903
 
@@ -6918,6 +6928,10 @@ class Length(Func):
6918
6928
  _sql_names = ["LENGTH", "LEN", "CHAR_LENGTH", "CHARACTER_LENGTH"]
6919
6929
 
6920
6930
 
6931
+ class RtrimmedLength(Func):
6932
+ pass
6933
+
6934
+
6921
6935
  class BitLength(Func):
6922
6936
  pass
6923
6937
 
@@ -809,6 +809,8 @@ class Parser(metaclass=_Parser):
809
809
  exp.DataType: lambda self: self._parse_types(allow_identifiers=False, schema=True),
810
810
  exp.Expression: lambda self: self._parse_expression(),
811
811
  exp.From: lambda self: self._parse_from(joins=True),
812
+ exp.GrantPrincipal: lambda self: self._parse_grant_principal(),
813
+ exp.GrantPrivilege: lambda self: self._parse_grant_privilege(),
812
814
  exp.Group: lambda self: self._parse_group(),
813
815
  exp.Having: lambda self: self._parse_having(),
814
816
  exp.Hint: lambda self: self._parse_hint_body(),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlglot
3
- Version: 27.18.0
3
+ Version: 27.19.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
@@ -1813,6 +1813,7 @@ WHERE
1813
1813
  self.validate_identity("TO_JSON(9999999999, stringify_wide_numbers => FALSE)")
1814
1814
  self.validate_identity("RANGE_BUCKET(20, [0, 10, 20, 30, 40])")
1815
1815
  self.validate_identity("SELECT TRANSLATE(MODEL, 'in', 't') FROM (SELECT 'input' AS MODEL)")
1816
+ self.validate_identity("SELECT GRANT FROM (SELECT 'input' AS GRANT)")
1816
1817
 
1817
1818
  def test_errors(self):
1818
1819
  with self.assertRaises(ParseError):
@@ -37,6 +37,10 @@ class TestDatabricks(Validator):
37
37
  self.validate_identity("CREATE TABLE foo (x DATE GENERATED ALWAYS AS (CAST(y AS DATE)))")
38
38
  self.validate_identity("TRUNCATE TABLE t1 PARTITION(age = 10, name = 'test', address)")
39
39
  self.validate_identity("SELECT PARSE_JSON('{}')")
40
+
41
+ self.validate_identity("PARSE_URL('https://example.com/path')")
42
+ self.validate_identity("PARSE_URL('https://example.com/path', 'HOST')")
43
+ self.validate_identity("PARSE_URL('https://example.com/path', 'QUERY', 'param')")
40
44
  self.validate_identity(
41
45
  "CREATE TABLE IF NOT EXISTS db.table (a TIMESTAMP, b BOOLEAN GENERATED ALWAYS AS (NOT a IS NULL)) USING DELTA"
42
46
  )
@@ -31,6 +31,7 @@ class TestSnowflake(Validator):
31
31
 
32
32
  self.validate_identity("SELECT BIT_LENGTH('abc')")
33
33
  self.validate_identity("SELECT BIT_LENGTH(x'A1B2')")
34
+ self.validate_identity("SELECT RTRIMMED_LENGTH(' ABCD ')")
34
35
  self.validate_identity("SELECT HEX_DECODE_STRING('48656C6C6F')")
35
36
  self.validate_identity("SELECT HEX_ENCODE('Hello World')")
36
37
  self.validate_identity("SELECT HEX_ENCODE('Hello World', 1)")
@@ -41,7 +42,11 @@ class TestSnowflake(Validator):
41
42
  self.validate_identity("SELECT DECOMPRESS_STRING('compressed_data', 'ZSTD')")
42
43
  self.validate_identity("SELECT LPAD('Hello', 10, '*')")
43
44
  self.validate_identity("SELECT LPAD(tbl.bin_col, 10)")
45
+ self.validate_identity("SELECT RPAD('Hello', 10, '*')")
46
+ self.validate_identity("SELECT RPAD(tbl.bin_col, 10)")
44
47
  self.validate_identity("SELECT JAROWINKLER_SIMILARITY('hello', 'world')")
48
+ self.validate_identity("PARSE_URL('https://example.com/path')")
49
+ self.validate_identity("PARSE_URL('https://example.com/path', 1)")
45
50
  self.validate_identity("SELECT {*} FROM my_table")
46
51
  self.validate_identity("SELECT {my_table.*} FROM my_table")
47
52
  self.validate_identity("SELECT {* ILIKE 'col1%'} FROM my_table")
@@ -111,6 +116,8 @@ class TestSnowflake(Validator):
111
116
  self.validate_identity("SELECT TO_CHAR(CAST('12:05:05' AS TIME))")
112
117
  self.validate_identity("SELECT TRIM(COALESCE(TO_CHAR(CAST(c AS TIME)), '')) FROM t")
113
118
  self.validate_identity("SELECT GET_PATH(PARSE_JSON(foo), 'bar')")
119
+ self.validate_identity("SELECT PARSE_IP('192.168.1.1', 'INET')")
120
+ self.validate_identity("SELECT PARSE_IP('192.168.1.1', 'INET', 0)")
114
121
  self.validate_identity("SELECT GET_PATH(foo, 'bar')")
115
122
  self.validate_identity("SELECT a, exclude, b FROM xxx")
116
123
  self.validate_identity("SELECT ARRAY_SORT(x, TRUE, FALSE)")
@@ -1019,6 +1026,24 @@ class TestSnowflake(Validator):
1019
1026
  "spark": "SELECT a RLIKE b",
1020
1027
  },
1021
1028
  )
1029
+ self.validate_all(
1030
+ "'foo' REGEXP 'bar'",
1031
+ write={
1032
+ "snowflake": "REGEXP_LIKE('foo', 'bar')",
1033
+ "postgres": "'foo' ~ 'bar'",
1034
+ "mysql": "REGEXP_LIKE('foo', 'bar')",
1035
+ "bigquery": "REGEXP_CONTAINS('foo', 'bar')",
1036
+ },
1037
+ )
1038
+ self.validate_all(
1039
+ "'foo' NOT REGEXP 'bar'",
1040
+ write={
1041
+ "snowflake": "NOT REGEXP_LIKE('foo', 'bar')",
1042
+ "postgres": "NOT 'foo' ~ 'bar'",
1043
+ "mysql": "NOT REGEXP_LIKE('foo', 'bar')",
1044
+ "bigquery": "NOT REGEXP_CONTAINS('foo', 'bar')",
1045
+ },
1046
+ )
1022
1047
  self.validate_all(
1023
1048
  "SELECT a FROM test pivot",
1024
1049
  write={
@@ -1651,6 +1651,18 @@ VARCHAR;
1651
1651
  LPAD(tbl.bin_col, 10, 0x20);
1652
1652
  BINARY;
1653
1653
 
1654
+ # dialect: snowflake
1655
+ RPAD('Hello', 10, '*');
1656
+ VARCHAR;
1657
+
1658
+ # dialect: snowflake
1659
+ RPAD(tbl.str_col, 10);
1660
+ VARCHAR;
1661
+
1662
+ # dialect: snowflake
1663
+ RPAD(tbl.bin_col, 10, 0x20);
1664
+ BINARY;
1665
+
1654
1666
  # dialect: snowflake
1655
1667
  COLLATION('hello');
1656
1668
  VARCHAR;
@@ -1799,6 +1811,34 @@ INT;
1799
1811
  LENGTH(tbl.bin_col);
1800
1812
  INT;
1801
1813
 
1814
+ # dialect: snowflake
1815
+ OCTET_LENGTH(tbl.str_col);
1816
+ INT;
1817
+
1818
+ # dialect: snowflake
1819
+ OCTET_LENGTH(tbl.bin_col);
1820
+ INT;
1821
+
1822
+ # dialect: snowflake
1823
+ PARSE_URL('https://example.com/path');
1824
+ OBJECT;
1825
+
1826
+ # dialect: snowflake
1827
+ PARSE_URL(tbl.str_col, 0);
1828
+ OBJECT;
1829
+
1830
+ # dialect: snowflake
1831
+ POSITION('abc' IN 'abcdef');
1832
+ INT;
1833
+
1834
+ # dialect: snowflake
1835
+ POSITION('abc', 'abcdef');
1836
+ INT;
1837
+
1838
+ # dialect: snowflake
1839
+ POSITION('abc', 'abcdef', 1);
1840
+ INT;
1841
+
1802
1842
  # dialect: snowflake
1803
1843
  LOWER(tbl.str_col);
1804
1844
  VARCHAR;
@@ -1815,6 +1855,18 @@ VARCHAR;
1815
1855
  LTRIM(NULL);
1816
1856
  VARCHAR;
1817
1857
 
1858
+ # dialect: snowflake
1859
+ 'foo' REGEXP 'bar';
1860
+ BOOLEAN;
1861
+
1862
+ # dialect: snowflake
1863
+ 'foo' NOT REGEXP 'bar';
1864
+ BOOLEAN;
1865
+
1866
+ # dialect: snowflake
1867
+ 'text123' REGEXP '^[a-z]+[0-9]+$';
1868
+ BOOLEAN;
1869
+
1818
1870
  # dialect: snowflake
1819
1871
  REGEXP_LIKE('foo', 'bar');
1820
1872
  BOOLEAN;
@@ -1939,6 +1991,10 @@ VARCHAR;
1939
1991
  RTRIM(NULL);
1940
1992
  VARCHAR;
1941
1993
 
1994
+ # dialect: snowflake
1995
+ RTRIMMED_LENGTH(' ABCD ');
1996
+ INT;
1997
+
1942
1998
  # dialect: snowflake
1943
1999
  SHA1('foo');
1944
2000
  VARCHAR;
@@ -2171,6 +2227,10 @@ BOOLEAN;
2171
2227
  ILIKE(tbl.str_col, 'pattern');
2172
2228
  BOOLEAN;
2173
2229
 
2230
+ # dialect: snowflake
2231
+ PARSE_IP('192.168.1.1', 'INET');
2232
+ OBJECT;
2233
+
2174
2234
  --------------------------------------
2175
2235
  -- T-SQL
2176
2236
  --------------------------------------
@@ -1029,3 +1029,24 @@ class TestParser(unittest.TestCase):
1029
1029
  parse_one(sql, error_level=ErrorLevel.IGNORE).sql(),
1030
1030
  "SELECT * FROM a WHERE c = 'false'",
1031
1031
  )
1032
+
1033
+ def test_parse_into_grant_principal(self):
1034
+ self.assertIsInstance(parse_one("ROLE blah", into=exp.GrantPrincipal), exp.GrantPrincipal)
1035
+ self.assertIsInstance(parse_one("GROUP blah", into=exp.GrantPrincipal), exp.GrantPrincipal)
1036
+ self.assertIsInstance(parse_one("blah", into=exp.GrantPrincipal), exp.GrantPrincipal)
1037
+ self.assertIsInstance(
1038
+ parse_one("ROLE `blah`", into=exp.GrantPrincipal, dialect="databricks"),
1039
+ exp.GrantPrincipal,
1040
+ )
1041
+ self.assertEqual(
1042
+ parse_one("ROLE `blah`", into=exp.GrantPrincipal, dialect="databricks").sql(
1043
+ dialect="databricks"
1044
+ ),
1045
+ "ROLE `blah`",
1046
+ )
1047
+
1048
+ def test_parse_into_grant_privilege(self):
1049
+ self.assertIsInstance(parse_one("SELECT", into=exp.GrantPrivilege), exp.GrantPrivilege)
1050
+ self.assertIsInstance(
1051
+ parse_one("ALL PRIVILEGES", into=exp.GrantPrivilege), exp.GrantPrivilege
1052
+ )
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes