sqlframe 3.36.2__tar.gz → 3.37.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 (388) hide show
  1. {sqlframe-3.36.2 → sqlframe-3.37.0}/Makefile +1 -1
  2. {sqlframe-3.36.2 → sqlframe-3.37.0}/PKG-INFO +1 -1
  3. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/bigquery.md +7 -0
  4. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/duckdb.md +5 -0
  5. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/postgres.md +5 -0
  6. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/snowflake.md +5 -0
  7. {sqlframe-3.36.2 → sqlframe-3.37.0}/setup.py +4 -3
  8. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/_version.py +2 -2
  9. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/functions.py +36 -10
  10. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/types.py +1 -1
  11. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe.egg-info/PKG-INFO +1 -1
  12. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe.egg-info/requires.txt +4 -3
  13. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/test_int_functions.py +72 -16
  14. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/standalone/test_functions.py +26 -8
  15. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/standalone/test_types.py +2 -2
  16. {sqlframe-3.36.2 → sqlframe-3.37.0}/.github/CODEOWNERS +0 -0
  17. {sqlframe-3.36.2 → sqlframe-3.37.0}/.github/workflows/main.workflow.yaml +0 -0
  18. {sqlframe-3.36.2 → sqlframe-3.37.0}/.github/workflows/publish.workflow.yaml +0 -0
  19. {sqlframe-3.36.2 → sqlframe-3.37.0}/.gitignore +0 -0
  20. {sqlframe-3.36.2 → sqlframe-3.37.0}/.pre-commit-config.yaml +0 -0
  21. {sqlframe-3.36.2 → sqlframe-3.37.0}/.readthedocs.yaml +0 -0
  22. {sqlframe-3.36.2 → sqlframe-3.37.0}/LICENSE +0 -0
  23. {sqlframe-3.36.2 → sqlframe-3.37.0}/README.md +0 -0
  24. {sqlframe-3.36.2 → sqlframe-3.37.0}/blogs/add_chatgpt_support.md +0 -0
  25. {sqlframe-3.36.2 → sqlframe-3.37.0}/blogs/images/add_chatgpt_support/adding_ai_to_meal.jpeg +0 -0
  26. {sqlframe-3.36.2 → sqlframe-3.37.0}/blogs/images/add_chatgpt_support/hype_train.gif +0 -0
  27. {sqlframe-3.36.2 → sqlframe-3.37.0}/blogs/images/add_chatgpt_support/marvin_paranoid_robot.gif +0 -0
  28. {sqlframe-3.36.2 → sqlframe-3.37.0}/blogs/images/add_chatgpt_support/nonsense_sql.png +0 -0
  29. {sqlframe-3.36.2 → sqlframe-3.37.0}/blogs/images/add_chatgpt_support/openai_full_rewrite.png +0 -0
  30. {sqlframe-3.36.2 → sqlframe-3.37.0}/blogs/images/add_chatgpt_support/openai_replacing_cte_names.png +0 -0
  31. {sqlframe-3.36.2 → sqlframe-3.37.0}/blogs/images/add_chatgpt_support/sqlglot_optimized_code.png +0 -0
  32. {sqlframe-3.36.2 → sqlframe-3.37.0}/blogs/images/add_chatgpt_support/sunny_shake_head_no.gif +0 -0
  33. {sqlframe-3.36.2 → sqlframe-3.37.0}/blogs/images/but_wait_theres_more.gif +0 -0
  34. {sqlframe-3.36.2 → sqlframe-3.37.0}/blogs/images/cake.gif +0 -0
  35. {sqlframe-3.36.2 → sqlframe-3.37.0}/blogs/images/you_get_pyspark_api.gif +0 -0
  36. {sqlframe-3.36.2 → sqlframe-3.37.0}/blogs/sqlframe_universal_dataframe_api.md +0 -0
  37. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/configuration.md +0 -0
  38. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/databricks.md +0 -0
  39. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/docs/bigquery.md +0 -0
  40. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/docs/duckdb.md +0 -0
  41. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/docs/images/SF.png +0 -0
  42. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/docs/images/favicon.png +0 -0
  43. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/docs/images/sqlframe_logo.png +0 -0
  44. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/docs/postgres.md +0 -0
  45. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/images/SF.png +0 -0
  46. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/images/favicon.png +0 -0
  47. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/images/sqlframe_logo.png +0 -0
  48. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/index.md +0 -0
  49. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/redshift.md +0 -0
  50. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/requirements.txt +0 -0
  51. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/spark.md +0 -0
  52. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/standalone.md +0 -0
  53. {sqlframe-3.36.2 → sqlframe-3.37.0}/docs/stylesheets/extra.css +0 -0
  54. {sqlframe-3.36.2 → sqlframe-3.37.0}/mkdocs.yml +0 -0
  55. {sqlframe-3.36.2 → sqlframe-3.37.0}/pytest.ini +0 -0
  56. {sqlframe-3.36.2 → sqlframe-3.37.0}/renovate.json +0 -0
  57. {sqlframe-3.36.2 → sqlframe-3.37.0}/setup.cfg +0 -0
  58. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/LICENSE +0 -0
  59. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/__init__.py +0 -0
  60. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/__init__.py +0 -0
  61. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/_typing.py +0 -0
  62. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/catalog.py +0 -0
  63. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/column.py +0 -0
  64. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/dataframe.py +0 -0
  65. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/decorators.py +0 -0
  66. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/exceptions.py +0 -0
  67. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/function_alternatives.py +0 -0
  68. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/group.py +0 -0
  69. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/mixins/__init__.py +0 -0
  70. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/mixins/catalog_mixins.py +0 -0
  71. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/mixins/dataframe_mixins.py +0 -0
  72. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/mixins/readwriter_mixins.py +0 -0
  73. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/mixins/table_mixins.py +0 -0
  74. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/normalize.py +0 -0
  75. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/operations.py +0 -0
  76. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/readerwriter.py +0 -0
  77. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/session.py +0 -0
  78. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/table.py +0 -0
  79. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/transforms.py +0 -0
  80. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/udf.py +0 -0
  81. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/util.py +0 -0
  82. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/base/window.py +0 -0
  83. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/bigquery/__init__.py +0 -0
  84. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/bigquery/catalog.py +0 -0
  85. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/bigquery/column.py +0 -0
  86. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/bigquery/dataframe.py +0 -0
  87. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/bigquery/functions.py +0 -0
  88. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/bigquery/functions.pyi +0 -0
  89. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/bigquery/group.py +0 -0
  90. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/bigquery/readwriter.py +0 -0
  91. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/bigquery/session.py +0 -0
  92. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/bigquery/table.py +0 -0
  93. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/bigquery/types.py +0 -0
  94. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/bigquery/udf.py +0 -0
  95. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/bigquery/window.py +0 -0
  96. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/databricks/__init__.py +0 -0
  97. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/databricks/catalog.py +0 -0
  98. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/databricks/column.py +0 -0
  99. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/databricks/dataframe.py +0 -0
  100. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/databricks/functions.py +0 -0
  101. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/databricks/functions.pyi +0 -0
  102. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/databricks/group.py +0 -0
  103. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/databricks/readwriter.py +0 -0
  104. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/databricks/session.py +0 -0
  105. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/databricks/table.py +0 -0
  106. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/databricks/types.py +0 -0
  107. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/databricks/udf.py +0 -0
  108. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/databricks/window.py +0 -0
  109. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/duckdb/__init__.py +0 -0
  110. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/duckdb/catalog.py +0 -0
  111. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/duckdb/column.py +0 -0
  112. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/duckdb/dataframe.py +0 -0
  113. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/duckdb/functions.py +0 -0
  114. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/duckdb/functions.pyi +0 -0
  115. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/duckdb/group.py +0 -0
  116. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/duckdb/readwriter.py +0 -0
  117. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/duckdb/session.py +0 -0
  118. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/duckdb/table.py +0 -0
  119. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/duckdb/types.py +0 -0
  120. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/duckdb/udf.py +0 -0
  121. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/duckdb/window.py +0 -0
  122. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/postgres/__init__.py +0 -0
  123. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/postgres/catalog.py +0 -0
  124. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/postgres/column.py +0 -0
  125. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/postgres/dataframe.py +0 -0
  126. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/postgres/functions.py +0 -0
  127. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/postgres/functions.pyi +0 -0
  128. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/postgres/group.py +0 -0
  129. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/postgres/readwriter.py +0 -0
  130. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/postgres/session.py +0 -0
  131. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/postgres/table.py +0 -0
  132. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/postgres/types.py +0 -0
  133. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/postgres/udf.py +0 -0
  134. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/postgres/window.py +0 -0
  135. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/py.typed +0 -0
  136. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/redshift/__init__.py +0 -0
  137. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/redshift/catalog.py +0 -0
  138. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/redshift/column.py +0 -0
  139. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/redshift/dataframe.py +0 -0
  140. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/redshift/functions.py +0 -0
  141. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/redshift/group.py +0 -0
  142. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/redshift/readwriter.py +0 -0
  143. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/redshift/session.py +0 -0
  144. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/redshift/table.py +0 -0
  145. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/redshift/types.py +0 -0
  146. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/redshift/udf.py +0 -0
  147. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/redshift/window.py +0 -0
  148. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/snowflake/__init__.py +0 -0
  149. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/snowflake/catalog.py +0 -0
  150. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/snowflake/column.py +0 -0
  151. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/snowflake/dataframe.py +0 -0
  152. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/snowflake/functions.py +0 -0
  153. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/snowflake/functions.pyi +0 -0
  154. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/snowflake/group.py +0 -0
  155. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/snowflake/readwriter.py +0 -0
  156. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/snowflake/session.py +0 -0
  157. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/snowflake/table.py +0 -0
  158. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/snowflake/types.py +0 -0
  159. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/snowflake/udf.py +0 -0
  160. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/snowflake/window.py +0 -0
  161. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/spark/__init__.py +0 -0
  162. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/spark/catalog.py +0 -0
  163. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/spark/column.py +0 -0
  164. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/spark/dataframe.py +0 -0
  165. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/spark/functions.py +0 -0
  166. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/spark/functions.pyi +0 -0
  167. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/spark/group.py +0 -0
  168. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/spark/readwriter.py +0 -0
  169. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/spark/session.py +0 -0
  170. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/spark/table.py +0 -0
  171. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/spark/types.py +0 -0
  172. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/spark/udf.py +0 -0
  173. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/spark/window.py +0 -0
  174. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/standalone/__init__.py +0 -0
  175. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/standalone/catalog.py +0 -0
  176. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/standalone/column.py +0 -0
  177. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/standalone/dataframe.py +0 -0
  178. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/standalone/functions.py +0 -0
  179. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/standalone/group.py +0 -0
  180. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/standalone/readwriter.py +0 -0
  181. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/standalone/session.py +0 -0
  182. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/standalone/table.py +0 -0
  183. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/standalone/types.py +0 -0
  184. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/standalone/udf.py +0 -0
  185. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/standalone/window.py +0 -0
  186. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/testing/__init__.py +0 -0
  187. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe/testing/utils.py +0 -0
  188. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe.egg-info/SOURCES.txt +0 -0
  189. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe.egg-info/dependency_links.txt +0 -0
  190. {sqlframe-3.36.2 → sqlframe-3.37.0}/sqlframe.egg-info/top_level.txt +0 -0
  191. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/__init__.py +0 -0
  192. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/common_fixtures.py +0 -0
  193. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/conftest.py +0 -0
  194. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee.csv +0 -0
  195. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee.json +0 -0
  196. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee.parquet +0 -0
  197. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee_delta/.part-00000-e5965c7b-e58f-4d3c-ad56-002876814e3a-c000.snappy.parquet.crc +0 -0
  198. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee_delta/.part-00002-3fed7f18-370f-4b16-b232-504d6194eb52-c000.snappy.parquet.crc +0 -0
  199. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee_delta/.part-00004-143c5da1-d5ab-4706-8e84-0d2a324c6894-c000.snappy.parquet.crc +0 -0
  200. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee_delta/.part-00006-64f07e25-c30e-4075-acc6-b3c69c4ce80b-c000.snappy.parquet.crc +0 -0
  201. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee_delta/.part-00008-89ccad8d-df73-4ad5-8850-82ef3884db60-c000.snappy.parquet.crc +0 -0
  202. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee_delta/.part-00010-812b3382-8c7f-4c4e-9bcd-09ce8664f6e0-c000.snappy.parquet.crc +0 -0
  203. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee_delta/_delta_log/.00000000000000000000.json.crc +0 -0
  204. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee_delta/_delta_log/00000000000000000000.json +0 -0
  205. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee_delta/part-00000-e5965c7b-e58f-4d3c-ad56-002876814e3a-c000.snappy.parquet +0 -0
  206. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee_delta/part-00002-3fed7f18-370f-4b16-b232-504d6194eb52-c000.snappy.parquet +0 -0
  207. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee_delta/part-00004-143c5da1-d5ab-4706-8e84-0d2a324c6894-c000.snappy.parquet +0 -0
  208. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee_delta/part-00006-64f07e25-c30e-4075-acc6-b3c69c4ce80b-c000.snappy.parquet +0 -0
  209. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee_delta/part-00008-89ccad8d-df73-4ad5-8850-82ef3884db60-c000.snappy.parquet +0 -0
  210. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee_delta/part-00010-812b3382-8c7f-4c4e-9bcd-09ce8664f6e0-c000.snappy.parquet +0 -0
  211. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/employee_extra_line.csv +0 -0
  212. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/issue_219.csv +0 -0
  213. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds1.sql +0 -0
  214. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds10.sql +0 -0
  215. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds11.sql +0 -0
  216. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds12.sql +0 -0
  217. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds13.sql +0 -0
  218. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds14.sql +0 -0
  219. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds15.sql +0 -0
  220. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds16.sql +0 -0
  221. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds17.sql +0 -0
  222. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds18.sql +0 -0
  223. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds19.sql +0 -0
  224. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds2.sql +0 -0
  225. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds20.sql +0 -0
  226. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds21.sql +0 -0
  227. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds22.sql +0 -0
  228. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds23.sql +0 -0
  229. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds24.sql +0 -0
  230. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds25.sql +0 -0
  231. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds26.sql +0 -0
  232. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds27.sql +0 -0
  233. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds28.sql +0 -0
  234. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds29.sql +0 -0
  235. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds3.sql +0 -0
  236. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds30.sql +0 -0
  237. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds31.sql +0 -0
  238. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds32.sql +0 -0
  239. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds33.sql +0 -0
  240. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds34.sql +0 -0
  241. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds35.sql +0 -0
  242. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds36.sql +0 -0
  243. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds37.sql +0 -0
  244. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds38.sql +0 -0
  245. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds39.sql +0 -0
  246. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds4.sql +0 -0
  247. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds40.sql +0 -0
  248. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds41.sql +0 -0
  249. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds42.sql +0 -0
  250. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds43.sql +0 -0
  251. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds44.sql +0 -0
  252. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds45.sql +0 -0
  253. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds46.sql +0 -0
  254. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds47.sql +0 -0
  255. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds48.sql +0 -0
  256. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds49.sql +0 -0
  257. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds5.sql +0 -0
  258. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds50.sql +0 -0
  259. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds51.sql +0 -0
  260. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds52.sql +0 -0
  261. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds53.sql +0 -0
  262. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds54.sql +0 -0
  263. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds55.sql +0 -0
  264. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds56.sql +0 -0
  265. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds57.sql +0 -0
  266. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds58.sql +0 -0
  267. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds59.sql +0 -0
  268. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds6.sql +0 -0
  269. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds60.sql +0 -0
  270. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds61.sql +0 -0
  271. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds62.sql +0 -0
  272. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds63.sql +0 -0
  273. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds64.sql +0 -0
  274. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds65.sql +0 -0
  275. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds66.sql +0 -0
  276. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds67.sql +0 -0
  277. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds68.sql +0 -0
  278. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds69.sql +0 -0
  279. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds7.sql +0 -0
  280. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds70.sql +0 -0
  281. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds71.sql +0 -0
  282. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds72.sql +0 -0
  283. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds73.sql +0 -0
  284. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds74.sql +0 -0
  285. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds75.sql +0 -0
  286. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds76.sql +0 -0
  287. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds77.sql +0 -0
  288. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds78.sql +0 -0
  289. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds79.sql +0 -0
  290. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds8.sql +0 -0
  291. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds80.sql +0 -0
  292. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds81.sql +0 -0
  293. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds82.sql +0 -0
  294. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds83.sql +0 -0
  295. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds84.sql +0 -0
  296. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds85.sql +0 -0
  297. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds86.sql +0 -0
  298. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds87.sql +0 -0
  299. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds88.sql +0 -0
  300. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds89.sql +0 -0
  301. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds9.sql +0 -0
  302. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds90.sql +0 -0
  303. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds91.sql +0 -0
  304. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds92.sql +0 -0
  305. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds93.sql +0 -0
  306. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds94.sql +0 -0
  307. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds95.sql +0 -0
  308. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds96.sql +0 -0
  309. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds97.sql +0 -0
  310. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds98.sql +0 -0
  311. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/fixtures/tpcds/tpcds99.sql +0 -0
  312. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/__init__.py +0 -0
  313. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/__init__.py +0 -0
  314. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/bigquery/__init__.py +0 -0
  315. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/bigquery/test_bigquery_catalog.py +0 -0
  316. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/bigquery/test_bigquery_dataframe.py +0 -0
  317. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/bigquery/test_bigquery_session.py +0 -0
  318. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/databricks/__init__.py +0 -0
  319. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/databricks/test_databricks_catalog.py +0 -0
  320. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/databricks/test_databricks_dataframe.py +0 -0
  321. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/databricks/test_databricks_session.py +0 -0
  322. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/duck/__init__.py +0 -0
  323. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/duck/test_duckdb_activate.py +0 -0
  324. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/duck/test_duckdb_catalog.py +0 -0
  325. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/duck/test_duckdb_dataframe.py +0 -0
  326. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/duck/test_duckdb_reader.py +0 -0
  327. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/duck/test_duckdb_session.py +0 -0
  328. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/duck/test_duckdb_udf.py +0 -0
  329. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/duck/test_tpcds.py +0 -0
  330. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/postgres/__init__.py +0 -0
  331. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/postgres/test_postgres_activate.py +0 -0
  332. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/postgres/test_postgres_catalog.py +0 -0
  333. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/postgres/test_postgres_dataframe.py +0 -0
  334. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/postgres/test_postgres_session.py +0 -0
  335. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/redshift/__init__.py +0 -0
  336. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/redshift/test_redshift_catalog.py +0 -0
  337. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/redshift/test_redshift_session.py +0 -0
  338. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/snowflake/__init__.py +0 -0
  339. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/snowflake/test_snowflake_catalog.py +0 -0
  340. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/snowflake/test_snowflake_dataframe.py +0 -0
  341. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/snowflake/test_snowflake_session.py +0 -0
  342. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/spark/__init__.py +0 -0
  343. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/spark/test_spark_catalog.py +0 -0
  344. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/spark/test_spark_dataframe.py +0 -0
  345. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/test_engine_column.py +0 -0
  346. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/test_engine_dataframe.py +0 -0
  347. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/test_engine_reader.py +0 -0
  348. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/test_engine_session.py +0 -0
  349. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/test_engine_table.py +0 -0
  350. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/test_engine_writer.py +0 -0
  351. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/engines/test_int_testing.py +0 -0
  352. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/fixtures.py +0 -0
  353. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/test_int_dataframe.py +0 -0
  354. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/test_int_dataframe_stats.py +0 -0
  355. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/test_int_grouped_data.py +0 -0
  356. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/integration/test_int_session.py +0 -0
  357. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/types.py +0 -0
  358. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/__init__.py +0 -0
  359. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/bigquery/__init__.py +0 -0
  360. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/bigquery/test_activate.py +0 -0
  361. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/conftest.py +0 -0
  362. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/databricks/__init__.py +0 -0
  363. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/databricks/test_activate.py +0 -0
  364. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/duck/__init__.py +0 -0
  365. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/duck/test_activate.py +0 -0
  366. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/duck/test_reader_options.py +0 -0
  367. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/postgres/__init__.py +0 -0
  368. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/postgres/test_activate.py +0 -0
  369. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/redshift/__init__.py +0 -0
  370. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/redshift/test_activate.py +0 -0
  371. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/snowflake/__init__.py +0 -0
  372. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/snowflake/test_activate.py +0 -0
  373. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/spark/__init__.py +0 -0
  374. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/spark/test_activate.py +0 -0
  375. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/spark/test_reader_options.py +0 -0
  376. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/standalone/__init__.py +0 -0
  377. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/standalone/fixtures.py +0 -0
  378. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/standalone/test_activate.py +0 -0
  379. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/standalone/test_column.py +0 -0
  380. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/standalone/test_dataframe.py +0 -0
  381. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/standalone/test_dataframe_writer.py +0 -0
  382. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/standalone/test_session.py +0 -0
  383. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/standalone/test_session_case_sensitivity.py +0 -0
  384. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/standalone/test_window.py +0 -0
  385. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/test_activate.py +0 -0
  386. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/test_base_reader_options.py +0 -0
  387. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/test_catalog.py +0 -0
  388. {sqlframe-3.36.2 → sqlframe-3.37.0}/tests/unit/test_util.py +0 -0
@@ -11,7 +11,7 @@ fast-test:
11
11
  pytest -n auto tests/unit
12
12
 
13
13
  local-test:
14
- pytest -n auto -m "fast or local"
14
+ pytest -n auto -m "fast or local" --reruns 5
15
15
 
16
16
  %-test:
17
17
  pytest -n auto -m "${*}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sqlframe
3
- Version: 3.36.2
3
+ Version: 3.37.0
4
4
  Summary: Turning PySpark Into a Universal DataFrame API
5
5
  Home-page: https://github.com/eakmanrq/sqlframe
6
6
  Author: Ryan Eakman
@@ -332,8 +332,12 @@ See something that you would like to see supported? [Open an issue](https://gith
332
332
  * [avg](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.avg.html)
333
333
  * [base64](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.base64.html)
334
334
  * [bin](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bin.html)
335
+ * [bit_and](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bit_and.html)
336
+ * [bit_count](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bit_count.html)
335
337
  * [bit_length](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bit_length.html)
336
338
  * Symbols are not supported
339
+ * [bit_or](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bit_or.html)
340
+ * [bit_xor](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bit_xor.html)
337
341
  * [bitwiseNOT](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bitwiseNOT.html)
338
342
  * [bitwise_not](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bitwise_not.html)
339
343
  * [bool_and](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bool_and.html)
@@ -416,6 +420,8 @@ See something that you would like to see supported? [Open an issue](https://gith
416
420
  * [isnull](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.isnull.html)
417
421
  * [lag](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.lag.html)
418
422
  * [last_day](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.last_day.html)
423
+ * [last_value](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.last_value.html)
424
+ * Must be used with a window function
419
425
  * [lcase](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.lcase.html)
420
426
  * [lead](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.lead.html)
421
427
  * [least](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.least.html)
@@ -507,6 +513,7 @@ See something that you would like to see supported? [Open an issue](https://gith
507
513
  * [sum_distinct](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.sum_distinct.html)
508
514
  * [tan](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.tan.html)
509
515
  * [tanh](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.tanh.html)
516
+ * [timestamp_add](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.timestamp_add.html)
510
517
  * [timestamp_seconds](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.timestamp_seconds.html)
511
518
  * [toDegrees](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.toDegrees.html)
512
519
  * [toRadians](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.toRadians.html)
@@ -295,7 +295,11 @@ See something that you would like to see supported? [Open an issue](https://gith
295
295
  * [avg](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.avg.html)
296
296
  * [base64](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.base64.html)
297
297
  * [bin](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bin.html)
298
+ * [bit_and](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bit_and.html)
299
+ * [bit_count](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bit_count.html)
298
300
  * [bit_length](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bit_length.html)
301
+ * [bit_or](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bit_or.html)
302
+ * [bit_xor](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bit_xor.html)
299
303
  * [bitwiseNOT](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bitwiseNOT.html)
300
304
  * [bitwise_not](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bitwise_not.html)
301
305
  * [bool_and](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bool_and.html)
@@ -468,6 +472,7 @@ See something that you would like to see supported? [Open an issue](https://gith
468
472
  * [sumDistinct](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.sumDistinct.html)
469
473
  * [sum_distinct](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.sum_distinct.html)
470
474
  * [tan](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.tan.html)
475
+ * [timestamp_add](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.timestamp_add.html)
471
476
  * [timestamp_seconds](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.timestamp_seconds.html)
472
477
  * [toDegrees](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.toDegrees.html)
473
478
  * [toRadians](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.toRadians.html)
@@ -304,7 +304,10 @@ See something that you would like to see supported? [Open an issue](https://gith
304
304
  * [atanh](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.atanh.html)
305
305
  * [avg](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.avg.html)
306
306
  * [base64](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.base64.html)
307
+ * [bit_and](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bit_and.html)
307
308
  * [bit_length](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bit_length.html)
309
+ * [bit_or](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bit_or.html)
310
+ * [bit_xor](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bit_xor.html)
308
311
  * [bitwiseNOT](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bitwiseNOT.html)
309
312
  * [bitwise_not](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bitwise_not.html)
310
313
  * [bool_and](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.bool_and.html)
@@ -455,6 +458,8 @@ See something that you would like to see supported? [Open an issue](https://gith
455
458
  * [sum_distinct](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.sum_distinct.html)
456
459
  * [tan](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.tan.html)
457
460
  * [tanh](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.tanh.html)
461
+ * [timestamp_add](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.timestamp_add.html)
462
+ * The quantity argument must be literal, not a column
458
463
  * [timestamp_seconds](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.timestamp_seconds.html)
459
464
  * [toDegrees](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.toDegrees.html)
460
465
  * [toRadians](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.toRadians.html)
@@ -394,6 +394,8 @@ See something that you would like to see supported? [Open an issue](https://gith
394
394
  * [expr](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.expr.html)
395
395
  * [extract](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.extract.html)
396
396
  * [factorial](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.factorial.html)
397
+ * [first_value](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.first_value.html)
398
+ * Must be used with a window function and `ignoreNulls` can behave slightly different in certain situations
397
399
  * [flatten](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.flatten.html)
398
400
  * [floor](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.floor.html)
399
401
  * [format_number](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.format_number.html)
@@ -414,6 +416,8 @@ See something that you would like to see supported? [Open an issue](https://gith
414
416
  * [kurtosis](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.kurtosis.html)
415
417
  * [lag](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.lag.html)
416
418
  * [last_day](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.last_day.html)
419
+ * [last_value](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.last_value.html)
420
+ * Must be used with a window function
417
421
  * [lead](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.lead.html)
418
422
  * [least](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.least.html)
419
423
  * [left](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.left.html)
@@ -507,6 +511,7 @@ See something that you would like to see supported? [Open an issue](https://gith
507
511
  * [sum_distinct](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.sum_distinct.html)
508
512
  * [tan](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.tan.html)
509
513
  * [tanh](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.tanh.html)
514
+ * [timestamp_add](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.timestamp_add.html)
510
515
  * [timestamp_seconds](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.timestamp_seconds.html)
511
516
  * [toDegrees](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.toDegrees.html)
512
517
  * [toRadians](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.toRadians.html)
@@ -20,7 +20,7 @@ setup(
20
20
  python_requires=">=3.9",
21
21
  install_requires=[
22
22
  "prettytable<4",
23
- "sqlglot>=24.0.0,<26.34",
23
+ "sqlglot>=24.0.0,<27.2",
24
24
  "typing_extensions",
25
25
  ],
26
26
  extras_require={
@@ -31,16 +31,17 @@ setup(
31
31
  "dev": [
32
32
  "duckdb>=1.2,<1.4",
33
33
  "findspark>=2,<3",
34
- "mypy>=1.10.0,<1.17",
34
+ "mypy>=1.10.0,<1.18",
35
35
  "openai>=1.30,<2",
36
36
  "pandas>=2,<3",
37
37
  "pandas-stubs>=2,<3",
38
38
  "psycopg>=3.1,<4",
39
- "pyarrow>=10,<21",
39
+ "pyarrow>=10,<22",
40
40
  "pyspark>=2,<3.6",
41
41
  "pytest>=8.2.0,<8.5",
42
42
  "pytest-forked",
43
43
  "pytest-postgresql>=6,<8",
44
+ "pytest-rerunfailures",
44
45
  "pytest-xdist>=3.6,<3.9",
45
46
  "pre-commit>=3.7,<5",
46
47
  "ruff>=0.4.4,<0.13",
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '3.36.2'
21
- __version_tuple__ = version_tuple = (3, 36, 2)
20
+ __version__ = version = '3.37.0'
21
+ __version_tuple__ = version_tuple = (3, 37, 0)
@@ -1475,6 +1475,32 @@ def timestamp_seconds(col: ColumnOrName) -> Column:
1475
1475
  return Column.invoke_expression_over_column(col, expression.UnixToTime)
1476
1476
 
1477
1477
 
1478
+ @meta()
1479
+ def timestamp_add(unit: str, quantity: ColumnOrName, ts: ColumnOrName) -> Column:
1480
+ session = _get_session()
1481
+
1482
+ if session._is_duckdb or session._is_postgres:
1483
+ quantity = lit(quantity) if isinstance(quantity, int) else quantity
1484
+ if (
1485
+ isinstance(quantity, Column)
1486
+ and isinstance(quantity.expression, expression.Literal)
1487
+ and quantity.expression.is_number
1488
+ and int(quantity.expression.this) < 0
1489
+ ):
1490
+ # If quantity is a negative literal, we use DateSub
1491
+ expr = expression.DateSub
1492
+ quantity.expression.set("this", str(-int(quantity.expression.this)))
1493
+ else:
1494
+ expr = expression.DateAdd # type: ignore
1495
+ return Column.invoke_expression_over_column(
1496
+ ts, expr, expression=quantity, unit=expression.Var(this=unit.upper())
1497
+ )
1498
+
1499
+ return Column.invoke_expression_over_column(
1500
+ ts, expression.TimestampAdd, expression=quantity, unit=expression.Var(this=unit.upper())
1501
+ )
1502
+
1503
+
1478
1504
  @meta(unsupported_engines=["*", "spark"])
1479
1505
  def window(
1480
1506
  timeColumn: ColumnOrName,
@@ -2084,24 +2110,24 @@ def array_size(col: ColumnOrName) -> Column:
2084
2110
  return Column.invoke_expression_over_column(col, expression.ArraySize)
2085
2111
 
2086
2112
 
2087
- @meta(unsupported_engines="*")
2113
+ @meta(unsupported_engines="snowflake")
2088
2114
  def bit_and(col: ColumnOrName) -> Column:
2089
- return Column.invoke_anonymous_function(col, "BIT_AND")
2115
+ return Column.invoke_expression_over_column(col, expression.BitwiseAndAgg)
2090
2116
 
2091
2117
 
2092
- @meta(unsupported_engines="*")
2118
+ @meta(unsupported_engines="snowflake")
2093
2119
  def bit_or(col: ColumnOrName) -> Column:
2094
- return Column.invoke_anonymous_function(col, "BIT_OR")
2120
+ return Column.invoke_expression_over_column(col, expression.BitwiseOrAgg)
2095
2121
 
2096
2122
 
2097
- @meta(unsupported_engines="*")
2123
+ @meta(unsupported_engines="snowflake")
2098
2124
  def bit_xor(col: ColumnOrName) -> Column:
2099
- return Column.invoke_anonymous_function(col, "BIT_XOR")
2125
+ return Column.invoke_expression_over_column(col, expression.BitwiseXorAgg)
2100
2126
 
2101
2127
 
2102
- @meta(unsupported_engines="*")
2128
+ @meta(unsupported_engines=["postgres", "snowflake"])
2103
2129
  def bit_count(col: ColumnOrName) -> Column:
2104
- return Column.invoke_anonymous_function(col, "BIT_COUNT")
2130
+ return Column.invoke_expression_over_column(col, expression.BitwiseCountAgg)
2105
2131
 
2106
2132
 
2107
2133
  @meta(unsupported_engines="*")
@@ -3267,7 +3293,7 @@ def find_in_set(str: ColumnOrName, str_array: ColumnOrName) -> Column:
3267
3293
  return Column.invoke_anonymous_function(str, "find_in_set", str_array)
3268
3294
 
3269
3295
 
3270
- @meta(unsupported_engines=["bigquery", "postgres", "snowflake"])
3296
+ @meta(unsupported_engines=["bigquery", "postgres"])
3271
3297
  def first_value(col: ColumnOrName, ignoreNulls: t.Optional[t.Union[bool, Column]] = None) -> Column:
3272
3298
  """Returns the first value of `col` for a group of rows. It will return the first non-null
3273
3299
  value it sees when `ignoreNulls` is set to true. If all values are null, then null is returned.
@@ -3933,7 +3959,7 @@ def json_object_keys(col: ColumnOrName) -> Column:
3933
3959
  return Column.invoke_anonymous_function(col, "json_object_keys")
3934
3960
 
3935
3961
 
3936
- @meta(unsupported_engines=["bigquery", "postgres", "snowflake"])
3962
+ @meta(unsupported_engines="postgres")
3937
3963
  def last_value(col: ColumnOrName, ignoreNulls: t.Optional[t.Union[bool, Column]] = None) -> Column:
3938
3964
  """Returns the last value of `col` for a group of rows. It will return the last non-null
3939
3965
  value it sees when `ignoreNulls` is set to true. If all values are null, then null is returned.
@@ -42,7 +42,7 @@ class DataTypeWithLength(DataType):
42
42
  def __repr__(self) -> str:
43
43
  return f"{self.__class__.__name__}({self.length})"
44
44
 
45
- def __str__(self) -> str:
45
+ def simpleString(self) -> str:
46
46
  return f"{self.typeName()}({self.length})"
47
47
 
48
48
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sqlframe
3
- Version: 3.36.2
3
+ Version: 3.37.0
4
4
  Summary: Turning PySpark Into a Universal DataFrame API
5
5
  Home-page: https://github.com/eakmanrq/sqlframe
6
6
  Author: Ryan Eakman
@@ -1,5 +1,5 @@
1
1
  prettytable<4
2
- sqlglot<26.34,>=24.0.0
2
+ sqlglot<27.2,>=24.0.0
3
3
  typing_extensions
4
4
 
5
5
  [bigquery]
@@ -12,16 +12,17 @@ databricks-sql-connector[pyarrow]<5,>=3.6
12
12
  [dev]
13
13
  duckdb<1.4,>=1.2
14
14
  findspark<3,>=2
15
- mypy<1.17,>=1.10.0
15
+ mypy<1.18,>=1.10.0
16
16
  openai<2,>=1.30
17
17
  pandas-stubs<3,>=2
18
18
  pandas<3,>=2
19
19
  pre-commit<5,>=3.7
20
20
  psycopg<4,>=3.1
21
- pyarrow<21,>=10
21
+ pyarrow<22,>=10
22
22
  pyspark<3.6,>=2
23
23
  pytest-forked
24
24
  pytest-postgresql<8,>=6
25
+ pytest-rerunfailures
25
26
  pytest-xdist<3.9,>=3.6
26
27
  pytest<8.5,>=8.2.0
27
28
  ruff<0.13,>=0.4.4
@@ -1531,6 +1531,58 @@ def test_timestamp_seconds(get_session_and_func):
1531
1531
  )
1532
1532
 
1533
1533
 
1534
+ def test_timestamp_add(get_session_and_func, get_func):
1535
+ session, timestamp_add = get_session_and_func("timestamp_add")
1536
+ lit = get_func("lit", session)
1537
+
1538
+ # Test data from PySpark examples
1539
+ df = session.createDataFrame(
1540
+ [(datetime.datetime(2016, 3, 11, 9, 0, 7), 2), (datetime.datetime(2024, 4, 2, 9, 0, 7), 3)],
1541
+ ["ts", "quantity"],
1542
+ )
1543
+
1544
+ # Test adding years
1545
+ if not session._is_postgres:
1546
+ result = df.select(timestamp_add("year", "quantity", "ts")).collect()
1547
+ expected_years = [
1548
+ datetime.datetime(2018, 3, 11, 9, 0, 7),
1549
+ datetime.datetime(2027, 4, 2, 9, 0, 7),
1550
+ ]
1551
+ for i, row in enumerate(result):
1552
+ actual = row[0].replace(tzinfo=None) if row[0] else None
1553
+ assert actual == expected_years[i], f"Year addition failed for row {i}"
1554
+
1555
+ # Test adding weeks
1556
+ result = df.select(timestamp_add("WEEK", lit(5), "ts")).collect()
1557
+ expected_weeks = [
1558
+ datetime.datetime(2016, 4, 15, 9, 0, 7),
1559
+ datetime.datetime(2024, 5, 7, 9, 0, 7),
1560
+ ]
1561
+ for i, row in enumerate(result):
1562
+ actual = row[0].replace(tzinfo=None) if row[0] else None
1563
+ assert actual == expected_weeks[i], f"Week addition failed for row {i}"
1564
+
1565
+ # Test subtracting days
1566
+ result = df.select(timestamp_add("day", lit(-5), "ts")).collect()
1567
+ expected_days = [
1568
+ datetime.datetime(2016, 3, 6, 9, 0, 7),
1569
+ datetime.datetime(2024, 3, 28, 9, 0, 7),
1570
+ ]
1571
+ for i, row in enumerate(result):
1572
+ actual = row[0].replace(tzinfo=None) if row[0] else None
1573
+ assert actual == expected_days[i], f"Day subtraction failed for row {i}"
1574
+
1575
+ # Test adding quarters
1576
+ result = df.select(timestamp_add("quarter", lit(2), "ts")).collect()
1577
+ expected_quarters = [
1578
+ datetime.datetime(2016, 9, 11, 9, 0, 7),
1579
+ datetime.datetime(2024, 10, 2, 9, 0, 7),
1580
+ ]
1581
+ for i, row in enumerate(result):
1582
+ actual = row[0].replace(tzinfo=None) if row[0] else None
1583
+ assert actual == expected_quarters[i], f"Quarter addition failed for row {i}"
1584
+
1585
+
1534
1586
  def test_window(get_session_and_func, get_func):
1535
1587
  session, window = get_session_and_func("window")
1536
1588
  sum = get_func("sum", session)
@@ -3783,14 +3835,15 @@ def test_first_value(get_session_and_func, get_func, get_window):
3783
3835
  session, first_value = get_session_and_func("first_value")
3784
3836
  col = get_func("col", session)
3785
3837
  Window = get_window(session)
3786
- assert session.createDataFrame(
3787
- [(None, 1), ("a", 2), ("a", 3), ("b", 8), ("b", 2)], ["a", "b"]
3788
- ).select(first_value("a"), first_value("b")).collect() == [Row(value1=None, value2=1)]
3789
- assert session.createDataFrame(
3790
- [(None, 1), ("a", 2), ("a", 3), ("b", 8), ("b", 2)], ["a", "b"]
3791
- ).select(first_value("a", True), first_value("b", True)).collect() == [
3792
- Row(value1="a", value2=1)
3793
- ]
3838
+ if not isinstance(session, (BigQuerySession, SnowflakeSession)):
3839
+ assert session.createDataFrame(
3840
+ [(None, 1), ("a", 2), ("a", 3), ("b", 8), ("b", 2)], ["a", "b"]
3841
+ ).select(first_value("a"), first_value("b")).collect() == [Row(value1=None, value2=1)]
3842
+ assert session.createDataFrame(
3843
+ [(None, 1), ("a", 2), ("a", 3), ("b", 8), ("b", 2)], ["a", "b"]
3844
+ ).select(first_value("a", True), first_value("b", True)).collect() == [
3845
+ Row(value1="a", value2=1)
3846
+ ]
3794
3847
  data = {
3795
3848
  "b": [None, None, "a", None, "b", "c", None, None, None, "d"],
3796
3849
  "idx": list(range(10)),
@@ -3801,8 +3854,8 @@ def test_first_value(get_session_and_func, get_func, get_window):
3801
3854
  assert session.createDataFrame(pd.DataFrame(data)).withColumn(
3802
3855
  "bf", first_value("b", ignoreNulls=True).over(window)
3803
3856
  ).collect() == [
3804
- Row(b=None, idx=0, bf=None),
3805
- Row(b=None, idx=1, bf=None),
3857
+ Row(b=None, idx=0, bf=None if not isinstance(session, SnowflakeSession) else "a"),
3858
+ Row(b=None, idx=1, bf=None if not isinstance(session, SnowflakeSession) else "a"),
3806
3859
  Row(b="a", idx=2, bf="a"),
3807
3860
  Row(b=None, idx=3, bf="a"),
3808
3861
  Row(b="b", idx=4, bf="a"),
@@ -4027,12 +4080,15 @@ def test_last_value(get_session_and_func, get_func, get_window):
4027
4080
  session, last_value = get_session_and_func("last_value")
4028
4081
  col = get_func("col", session)
4029
4082
  Window = get_window(session)
4030
- assert session.createDataFrame(
4031
- [("a", 1), ("a", 2), ("a", 3), ("b", 8), (None, 2)], ["a", "b"]
4032
- ).select(last_value("a"), last_value("b")).collect() == [Row(value1=None, value2=2)]
4033
- assert session.createDataFrame(
4034
- [("a", 1), ("a", 2), ("a", 3), ("b", 8), (None, 2)], ["a", "b"]
4035
- ).select(last_value("a", True), last_value("b", True)).collect() == [Row(value1="b", value2=2)]
4083
+ if not isinstance(session, (BigQuerySession, SnowflakeSession)):
4084
+ assert session.createDataFrame(
4085
+ [("a", 1), ("a", 2), ("a", 3), ("b", 8), (None, 2)], ["a", "b"]
4086
+ ).select(last_value("a"), last_value("b")).collect() == [Row(value1=None, value2=2)]
4087
+ assert session.createDataFrame(
4088
+ [("a", 1), ("a", 2), ("a", 3), ("b", 8), (None, 2)], ["a", "b"]
4089
+ ).select(last_value("a", True), last_value("b", True)).collect() == [
4090
+ Row(value1="b", value2=2)
4091
+ ]
4036
4092
  data = {
4037
4093
  "b": ["a", None, None, None, "b", "c", None, None, None, "d"],
4038
4094
  "idx": list(range(10)),
@@ -1256,8 +1256,8 @@ def test_month(expression, expected):
1256
1256
  @pytest.mark.parametrize(
1257
1257
  "expression, expected",
1258
1258
  [
1259
- (SF.dayofweek("cola"), "DAYOFWEEK(TO_DATE(cola))"),
1260
- (SF.dayofweek(SF.col("cola")), "DAYOFWEEK(TO_DATE(cola))"),
1259
+ (SF.dayofweek("cola"), "DAYOFWEEK(cola)"),
1260
+ (SF.dayofweek(SF.col("cola")), "DAYOFWEEK(cola)"),
1261
1261
  ],
1262
1262
  )
1263
1263
  def test_dayofweek(expression, expected):
@@ -1267,8 +1267,8 @@ def test_dayofweek(expression, expected):
1267
1267
  @pytest.mark.parametrize(
1268
1268
  "expression, expected",
1269
1269
  [
1270
- (SF.dayofmonth("cola"), "DAYOFMONTH(TO_DATE(cola))"),
1271
- (SF.dayofmonth(SF.col("cola")), "DAYOFMONTH(TO_DATE(cola))"),
1270
+ (SF.dayofmonth("cola"), "DAYOFMONTH(cola)"),
1271
+ (SF.dayofmonth(SF.col("cola")), "DAYOFMONTH(cola)"),
1272
1272
  ],
1273
1273
  )
1274
1274
  def test_dayofmonth(expression, expected):
@@ -1278,8 +1278,8 @@ def test_dayofmonth(expression, expected):
1278
1278
  @pytest.mark.parametrize(
1279
1279
  "expression, expected",
1280
1280
  [
1281
- (SF.dayofyear("cola"), "DAYOFYEAR(TO_DATE(cola))"),
1282
- (SF.dayofyear(SF.col("cola")), "DAYOFYEAR(TO_DATE(cola))"),
1281
+ (SF.dayofyear("cola"), "DAYOFYEAR(cola)"),
1282
+ (SF.dayofyear(SF.col("cola")), "DAYOFYEAR(cola)"),
1283
1283
  ],
1284
1284
  )
1285
1285
  def test_dayofyear(expression, expected):
@@ -1322,8 +1322,8 @@ def test_second(expression, expected):
1322
1322
  @pytest.mark.parametrize(
1323
1323
  "expression, expected",
1324
1324
  [
1325
- (SF.weekofyear("cola"), "WEEKOFYEAR(TO_DATE(cola))"),
1326
- (SF.weekofyear(SF.col("cola")), "WEEKOFYEAR(TO_DATE(cola))"),
1325
+ (SF.weekofyear("cola"), "WEEKOFYEAR(cola)"),
1326
+ (SF.weekofyear(SF.col("cola")), "WEEKOFYEAR(cola)"),
1327
1327
  ],
1328
1328
  )
1329
1329
  def test_weekofyear(expression, expected):
@@ -1544,6 +1544,24 @@ def test_timestamp_seconds(expression, expected):
1544
1544
  assert expression.column_expression.sql(dialect="spark") == expected
1545
1545
 
1546
1546
 
1547
+ @pytest.mark.parametrize(
1548
+ "expression, expected",
1549
+ [
1550
+ (SF.timestamp_add("year", "quantity", "ts"), "DATE_ADD(YEAR, quantity, ts)"),
1551
+ (SF.timestamp_add("WEEK", SF.lit(5), "ts"), "DATE_ADD(WEEK, 5, ts)"),
1552
+ (SF.timestamp_add("day", SF.lit(-5), "ts"), "DATE_ADD(DAY, -5, ts)"),
1553
+ (
1554
+ SF.timestamp_add("hour", SF.col("quantity"), SF.col("ts")),
1555
+ "DATE_ADD(HOUR, quantity, ts)",
1556
+ ),
1557
+ (SF.timestamp_add("second", SF.lit(120), "ts"), "DATE_ADD(SECOND, 120, ts)"),
1558
+ (SF.timestamp_add("month", "quantity", "ts"), "DATE_ADD(MONTH, quantity, ts)"),
1559
+ ],
1560
+ )
1561
+ def test_timestamp_add(expression, expected):
1562
+ assert expression.column_expression.sql(dialect="spark") == expected
1563
+
1564
+
1547
1565
  @pytest.mark.parametrize(
1548
1566
  "expression, expected",
1549
1567
  [
@@ -7,8 +7,8 @@ from sqlframe.standalone import types
7
7
  "dtype, expected",
8
8
  [
9
9
  (types.StringType(), "string"),
10
- (types.CharType(100), "char"),
11
- (types.VarcharType(65), "varchar"),
10
+ (types.CharType(100), "char(100)"),
11
+ (types.VarcharType(65), "varchar(65)"),
12
12
  (types.BinaryType(), "binary"),
13
13
  (types.BooleanType(), "boolean"),
14
14
  (types.DateType(), "date"),
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