sqlframe 3.22.0__tar.gz → 3.23.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 (387) hide show
  1. {sqlframe-3.22.0 → sqlframe-3.23.0}/PKG-INFO +1 -1
  2. {sqlframe-3.22.0 → sqlframe-3.23.0}/setup.py +5 -5
  3. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/_version.py +9 -4
  4. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/catalog.py +6 -3
  5. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/functions.py +14 -8
  6. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/util.py +0 -9
  7. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/window.py +19 -30
  8. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/duckdb/session.py +1 -3
  9. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe.egg-info/PKG-INFO +1 -1
  10. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe.egg-info/requires.txt +5 -5
  11. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/duck/test_duckdb_catalog.py +2 -12
  12. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/duck/test_duckdb_reader.py +8 -0
  13. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/test_int_functions.py +21 -6
  14. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/test_int_dataframe.py +86 -0
  15. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/standalone/test_column.py +4 -2
  16. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/standalone/test_functions.py +7 -4
  17. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/standalone/test_window.py +18 -6
  18. {sqlframe-3.22.0 → sqlframe-3.23.0}/.github/CODEOWNERS +0 -0
  19. {sqlframe-3.22.0 → sqlframe-3.23.0}/.github/workflows/main.workflow.yaml +0 -0
  20. {sqlframe-3.22.0 → sqlframe-3.23.0}/.github/workflows/publish.workflow.yaml +0 -0
  21. {sqlframe-3.22.0 → sqlframe-3.23.0}/.gitignore +0 -0
  22. {sqlframe-3.22.0 → sqlframe-3.23.0}/.pre-commit-config.yaml +0 -0
  23. {sqlframe-3.22.0 → sqlframe-3.23.0}/.readthedocs.yaml +0 -0
  24. {sqlframe-3.22.0 → sqlframe-3.23.0}/LICENSE +0 -0
  25. {sqlframe-3.22.0 → sqlframe-3.23.0}/Makefile +0 -0
  26. {sqlframe-3.22.0 → sqlframe-3.23.0}/README.md +0 -0
  27. {sqlframe-3.22.0 → sqlframe-3.23.0}/blogs/add_chatgpt_support.md +0 -0
  28. {sqlframe-3.22.0 → sqlframe-3.23.0}/blogs/images/add_chatgpt_support/adding_ai_to_meal.jpeg +0 -0
  29. {sqlframe-3.22.0 → sqlframe-3.23.0}/blogs/images/add_chatgpt_support/hype_train.gif +0 -0
  30. {sqlframe-3.22.0 → sqlframe-3.23.0}/blogs/images/add_chatgpt_support/marvin_paranoid_robot.gif +0 -0
  31. {sqlframe-3.22.0 → sqlframe-3.23.0}/blogs/images/add_chatgpt_support/nonsense_sql.png +0 -0
  32. {sqlframe-3.22.0 → sqlframe-3.23.0}/blogs/images/add_chatgpt_support/openai_full_rewrite.png +0 -0
  33. {sqlframe-3.22.0 → sqlframe-3.23.0}/blogs/images/add_chatgpt_support/openai_replacing_cte_names.png +0 -0
  34. {sqlframe-3.22.0 → sqlframe-3.23.0}/blogs/images/add_chatgpt_support/sqlglot_optimized_code.png +0 -0
  35. {sqlframe-3.22.0 → sqlframe-3.23.0}/blogs/images/add_chatgpt_support/sunny_shake_head_no.gif +0 -0
  36. {sqlframe-3.22.0 → sqlframe-3.23.0}/blogs/images/but_wait_theres_more.gif +0 -0
  37. {sqlframe-3.22.0 → sqlframe-3.23.0}/blogs/images/cake.gif +0 -0
  38. {sqlframe-3.22.0 → sqlframe-3.23.0}/blogs/images/you_get_pyspark_api.gif +0 -0
  39. {sqlframe-3.22.0 → sqlframe-3.23.0}/blogs/sqlframe_universal_dataframe_api.md +0 -0
  40. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/bigquery.md +0 -0
  41. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/configuration.md +0 -0
  42. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/databricks.md +0 -0
  43. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/docs/bigquery.md +0 -0
  44. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/docs/duckdb.md +0 -0
  45. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/docs/images/SF.png +0 -0
  46. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/docs/images/favicon.png +0 -0
  47. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/docs/images/favicon_old.png +0 -0
  48. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/docs/images/sqlframe_diagram.png +0 -0
  49. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/docs/images/sqlframe_logo.png +0 -0
  50. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/docs/postgres.md +0 -0
  51. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/duckdb.md +0 -0
  52. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/images/SF.png +0 -0
  53. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/images/favicon.png +0 -0
  54. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/images/favicon_old.png +0 -0
  55. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/images/sqlframe_diagram.png +0 -0
  56. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/images/sqlframe_logo.png +0 -0
  57. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/index.md +0 -0
  58. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/postgres.md +0 -0
  59. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/redshift.md +0 -0
  60. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/requirements.txt +0 -0
  61. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/snowflake.md +0 -0
  62. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/spark.md +0 -0
  63. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/standalone.md +0 -0
  64. {sqlframe-3.22.0 → sqlframe-3.23.0}/docs/stylesheets/extra.css +0 -0
  65. {sqlframe-3.22.0 → sqlframe-3.23.0}/mkdocs.yml +0 -0
  66. {sqlframe-3.22.0 → sqlframe-3.23.0}/pytest.ini +0 -0
  67. {sqlframe-3.22.0 → sqlframe-3.23.0}/renovate.json +0 -0
  68. {sqlframe-3.22.0 → sqlframe-3.23.0}/setup.cfg +0 -0
  69. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/LICENSE +0 -0
  70. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/__init__.py +0 -0
  71. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/__init__.py +0 -0
  72. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/_typing.py +0 -0
  73. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/column.py +0 -0
  74. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/dataframe.py +0 -0
  75. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/decorators.py +0 -0
  76. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/exceptions.py +0 -0
  77. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/function_alternatives.py +0 -0
  78. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/group.py +0 -0
  79. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/mixins/__init__.py +0 -0
  80. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/mixins/catalog_mixins.py +0 -0
  81. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/mixins/dataframe_mixins.py +0 -0
  82. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/mixins/readwriter_mixins.py +0 -0
  83. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/mixins/table_mixins.py +0 -0
  84. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/normalize.py +0 -0
  85. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/operations.py +0 -0
  86. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/readerwriter.py +0 -0
  87. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/session.py +0 -0
  88. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/table.py +0 -0
  89. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/transforms.py +0 -0
  90. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/types.py +0 -0
  91. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/base/udf.py +0 -0
  92. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/bigquery/__init__.py +0 -0
  93. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/bigquery/catalog.py +0 -0
  94. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/bigquery/column.py +0 -0
  95. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/bigquery/dataframe.py +0 -0
  96. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/bigquery/functions.py +0 -0
  97. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/bigquery/functions.pyi +0 -0
  98. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/bigquery/group.py +0 -0
  99. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/bigquery/readwriter.py +0 -0
  100. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/bigquery/session.py +0 -0
  101. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/bigquery/table.py +0 -0
  102. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/bigquery/types.py +0 -0
  103. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/bigquery/udf.py +0 -0
  104. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/bigquery/window.py +0 -0
  105. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/databricks/__init__.py +0 -0
  106. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/databricks/catalog.py +0 -0
  107. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/databricks/column.py +0 -0
  108. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/databricks/dataframe.py +0 -0
  109. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/databricks/functions.py +0 -0
  110. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/databricks/functions.pyi +0 -0
  111. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/databricks/group.py +0 -0
  112. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/databricks/readwriter.py +0 -0
  113. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/databricks/session.py +0 -0
  114. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/databricks/table.py +0 -0
  115. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/databricks/types.py +0 -0
  116. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/databricks/udf.py +0 -0
  117. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/databricks/window.py +0 -0
  118. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/duckdb/__init__.py +0 -0
  119. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/duckdb/catalog.py +0 -0
  120. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/duckdb/column.py +0 -0
  121. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/duckdb/dataframe.py +0 -0
  122. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/duckdb/functions.py +0 -0
  123. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/duckdb/functions.pyi +0 -0
  124. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/duckdb/group.py +0 -0
  125. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/duckdb/readwriter.py +0 -0
  126. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/duckdb/table.py +0 -0
  127. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/duckdb/types.py +0 -0
  128. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/duckdb/udf.py +0 -0
  129. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/duckdb/window.py +0 -0
  130. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/postgres/__init__.py +0 -0
  131. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/postgres/catalog.py +0 -0
  132. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/postgres/column.py +0 -0
  133. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/postgres/dataframe.py +0 -0
  134. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/postgres/functions.py +0 -0
  135. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/postgres/functions.pyi +0 -0
  136. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/postgres/group.py +0 -0
  137. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/postgres/readwriter.py +0 -0
  138. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/postgres/session.py +0 -0
  139. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/postgres/table.py +0 -0
  140. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/postgres/types.py +0 -0
  141. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/postgres/udf.py +0 -0
  142. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/postgres/window.py +0 -0
  143. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/redshift/__init__.py +0 -0
  144. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/redshift/catalog.py +0 -0
  145. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/redshift/column.py +0 -0
  146. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/redshift/dataframe.py +0 -0
  147. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/redshift/functions.py +0 -0
  148. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/redshift/group.py +0 -0
  149. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/redshift/readwriter.py +0 -0
  150. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/redshift/session.py +0 -0
  151. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/redshift/table.py +0 -0
  152. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/redshift/types.py +0 -0
  153. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/redshift/udf.py +0 -0
  154. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/redshift/window.py +0 -0
  155. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/snowflake/__init__.py +0 -0
  156. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/snowflake/catalog.py +0 -0
  157. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/snowflake/column.py +0 -0
  158. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/snowflake/dataframe.py +0 -0
  159. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/snowflake/functions.py +0 -0
  160. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/snowflake/functions.pyi +0 -0
  161. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/snowflake/group.py +0 -0
  162. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/snowflake/readwriter.py +0 -0
  163. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/snowflake/session.py +0 -0
  164. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/snowflake/table.py +0 -0
  165. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/snowflake/types.py +0 -0
  166. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/snowflake/udf.py +0 -0
  167. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/snowflake/window.py +0 -0
  168. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/spark/__init__.py +0 -0
  169. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/spark/catalog.py +0 -0
  170. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/spark/column.py +0 -0
  171. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/spark/dataframe.py +0 -0
  172. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/spark/functions.py +0 -0
  173. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/spark/functions.pyi +0 -0
  174. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/spark/group.py +0 -0
  175. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/spark/readwriter.py +0 -0
  176. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/spark/session.py +0 -0
  177. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/spark/table.py +0 -0
  178. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/spark/types.py +0 -0
  179. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/spark/udf.py +0 -0
  180. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/spark/window.py +0 -0
  181. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/standalone/__init__.py +0 -0
  182. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/standalone/catalog.py +0 -0
  183. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/standalone/column.py +0 -0
  184. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/standalone/dataframe.py +0 -0
  185. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/standalone/functions.py +0 -0
  186. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/standalone/group.py +0 -0
  187. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/standalone/readwriter.py +0 -0
  188. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/standalone/session.py +0 -0
  189. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/standalone/table.py +0 -0
  190. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/standalone/types.py +0 -0
  191. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/standalone/udf.py +0 -0
  192. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/standalone/window.py +0 -0
  193. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/testing/__init__.py +0 -0
  194. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe/testing/utils.py +0 -0
  195. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe.egg-info/SOURCES.txt +0 -0
  196. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe.egg-info/dependency_links.txt +0 -0
  197. {sqlframe-3.22.0 → sqlframe-3.23.0}/sqlframe.egg-info/top_level.txt +0 -0
  198. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/__init__.py +0 -0
  199. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/common_fixtures.py +0 -0
  200. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/conftest.py +0 -0
  201. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee.csv +0 -0
  202. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee.json +0 -0
  203. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee.parquet +0 -0
  204. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee_delta/.part-00000-e5965c7b-e58f-4d3c-ad56-002876814e3a-c000.snappy.parquet.crc +0 -0
  205. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee_delta/.part-00002-3fed7f18-370f-4b16-b232-504d6194eb52-c000.snappy.parquet.crc +0 -0
  206. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee_delta/.part-00004-143c5da1-d5ab-4706-8e84-0d2a324c6894-c000.snappy.parquet.crc +0 -0
  207. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee_delta/.part-00006-64f07e25-c30e-4075-acc6-b3c69c4ce80b-c000.snappy.parquet.crc +0 -0
  208. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee_delta/.part-00008-89ccad8d-df73-4ad5-8850-82ef3884db60-c000.snappy.parquet.crc +0 -0
  209. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee_delta/.part-00010-812b3382-8c7f-4c4e-9bcd-09ce8664f6e0-c000.snappy.parquet.crc +0 -0
  210. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee_delta/_delta_log/.00000000000000000000.json.crc +0 -0
  211. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee_delta/_delta_log/00000000000000000000.json +0 -0
  212. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee_delta/part-00000-e5965c7b-e58f-4d3c-ad56-002876814e3a-c000.snappy.parquet +0 -0
  213. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee_delta/part-00002-3fed7f18-370f-4b16-b232-504d6194eb52-c000.snappy.parquet +0 -0
  214. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee_delta/part-00004-143c5da1-d5ab-4706-8e84-0d2a324c6894-c000.snappy.parquet +0 -0
  215. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee_delta/part-00006-64f07e25-c30e-4075-acc6-b3c69c4ce80b-c000.snappy.parquet +0 -0
  216. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee_delta/part-00008-89ccad8d-df73-4ad5-8850-82ef3884db60-c000.snappy.parquet +0 -0
  217. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee_delta/part-00010-812b3382-8c7f-4c4e-9bcd-09ce8664f6e0-c000.snappy.parquet +0 -0
  218. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/employee_extra_line.csv +0 -0
  219. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/issue_219.csv +0 -0
  220. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds1.sql +0 -0
  221. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds10.sql +0 -0
  222. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds11.sql +0 -0
  223. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds12.sql +0 -0
  224. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds13.sql +0 -0
  225. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds14.sql +0 -0
  226. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds15.sql +0 -0
  227. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds16.sql +0 -0
  228. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds17.sql +0 -0
  229. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds18.sql +0 -0
  230. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds19.sql +0 -0
  231. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds2.sql +0 -0
  232. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds20.sql +0 -0
  233. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds21.sql +0 -0
  234. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds22.sql +0 -0
  235. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds23.sql +0 -0
  236. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds24.sql +0 -0
  237. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds25.sql +0 -0
  238. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds26.sql +0 -0
  239. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds27.sql +0 -0
  240. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds28.sql +0 -0
  241. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds29.sql +0 -0
  242. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds3.sql +0 -0
  243. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds30.sql +0 -0
  244. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds31.sql +0 -0
  245. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds32.sql +0 -0
  246. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds33.sql +0 -0
  247. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds34.sql +0 -0
  248. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds35.sql +0 -0
  249. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds36.sql +0 -0
  250. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds37.sql +0 -0
  251. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds38.sql +0 -0
  252. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds39.sql +0 -0
  253. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds4.sql +0 -0
  254. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds40.sql +0 -0
  255. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds41.sql +0 -0
  256. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds42.sql +0 -0
  257. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds43.sql +0 -0
  258. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds44.sql +0 -0
  259. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds45.sql +0 -0
  260. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds46.sql +0 -0
  261. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds47.sql +0 -0
  262. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds48.sql +0 -0
  263. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds49.sql +0 -0
  264. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds5.sql +0 -0
  265. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds50.sql +0 -0
  266. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds51.sql +0 -0
  267. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds52.sql +0 -0
  268. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds53.sql +0 -0
  269. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds54.sql +0 -0
  270. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds55.sql +0 -0
  271. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds56.sql +0 -0
  272. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds57.sql +0 -0
  273. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds58.sql +0 -0
  274. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds59.sql +0 -0
  275. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds6.sql +0 -0
  276. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds60.sql +0 -0
  277. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds61.sql +0 -0
  278. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds62.sql +0 -0
  279. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds63.sql +0 -0
  280. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds64.sql +0 -0
  281. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds65.sql +0 -0
  282. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds66.sql +0 -0
  283. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds67.sql +0 -0
  284. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds68.sql +0 -0
  285. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds69.sql +0 -0
  286. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds7.sql +0 -0
  287. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds70.sql +0 -0
  288. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds71.sql +0 -0
  289. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds72.sql +0 -0
  290. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds73.sql +0 -0
  291. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds74.sql +0 -0
  292. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds75.sql +0 -0
  293. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds76.sql +0 -0
  294. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds77.sql +0 -0
  295. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds78.sql +0 -0
  296. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds79.sql +0 -0
  297. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds8.sql +0 -0
  298. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds80.sql +0 -0
  299. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds81.sql +0 -0
  300. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds82.sql +0 -0
  301. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds83.sql +0 -0
  302. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds84.sql +0 -0
  303. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds85.sql +0 -0
  304. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds86.sql +0 -0
  305. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds87.sql +0 -0
  306. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds88.sql +0 -0
  307. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds89.sql +0 -0
  308. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds9.sql +0 -0
  309. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds90.sql +0 -0
  310. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds91.sql +0 -0
  311. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds92.sql +0 -0
  312. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds93.sql +0 -0
  313. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds94.sql +0 -0
  314. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds95.sql +0 -0
  315. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds96.sql +0 -0
  316. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds97.sql +0 -0
  317. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds98.sql +0 -0
  318. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/fixtures/tpcds/tpcds99.sql +0 -0
  319. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/__init__.py +0 -0
  320. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/__init__.py +0 -0
  321. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/bigquery/__init__.py +0 -0
  322. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/bigquery/test_bigquery_catalog.py +0 -0
  323. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/bigquery/test_bigquery_dataframe.py +0 -0
  324. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/bigquery/test_bigquery_session.py +0 -0
  325. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/databricks/__init__.py +0 -0
  326. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/databricks/test_databricks_catalog.py +0 -0
  327. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/databricks/test_databricks_dataframe.py +0 -0
  328. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/databricks/test_databricks_session.py +0 -0
  329. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/duck/__init__.py +0 -0
  330. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/duck/test_duckdb_activate.py +0 -0
  331. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/duck/test_duckdb_dataframe.py +0 -0
  332. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/duck/test_duckdb_session.py +0 -0
  333. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/duck/test_duckdb_udf.py +0 -0
  334. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/duck/test_tpcds.py +0 -0
  335. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/postgres/__init__.py +0 -0
  336. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/postgres/test_postgres_activate.py +0 -0
  337. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/postgres/test_postgres_catalog.py +0 -0
  338. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/postgres/test_postgres_dataframe.py +0 -0
  339. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/postgres/test_postgres_session.py +0 -0
  340. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/redshift/__init__.py +0 -0
  341. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/redshift/test_redshift_catalog.py +0 -0
  342. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/redshift/test_redshift_session.py +0 -0
  343. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/snowflake/__init__.py +0 -0
  344. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/snowflake/test_snowflake_catalog.py +0 -0
  345. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/snowflake/test_snowflake_dataframe.py +0 -0
  346. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/snowflake/test_snowflake_session.py +0 -0
  347. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/spark/__init__.py +0 -0
  348. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/spark/test_spark_catalog.py +0 -0
  349. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/spark/test_spark_dataframe.py +0 -0
  350. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/test_engine_column.py +0 -0
  351. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/test_engine_dataframe.py +0 -0
  352. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/test_engine_reader.py +0 -0
  353. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/test_engine_session.py +0 -0
  354. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/test_engine_table.py +0 -0
  355. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/test_engine_writer.py +0 -0
  356. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/engines/test_int_testing.py +0 -0
  357. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/fixtures.py +0 -0
  358. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/test_int_dataframe_stats.py +0 -0
  359. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/test_int_grouped_data.py +0 -0
  360. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/integration/test_int_session.py +0 -0
  361. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/types.py +0 -0
  362. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/__init__.py +0 -0
  363. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/bigquery/__init__.py +0 -0
  364. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/bigquery/test_activate.py +0 -0
  365. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/conftest.py +0 -0
  366. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/databricks/__init__.py +0 -0
  367. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/databricks/test_activate.py +0 -0
  368. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/duck/__init__.py +0 -0
  369. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/duck/test_activate.py +0 -0
  370. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/postgres/__init__.py +0 -0
  371. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/postgres/test_activate.py +0 -0
  372. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/redshift/__init__.py +0 -0
  373. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/redshift/test_activate.py +0 -0
  374. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/snowflake/__init__.py +0 -0
  375. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/snowflake/test_activate.py +0 -0
  376. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/spark/__init__.py +0 -0
  377. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/spark/test_activate.py +0 -0
  378. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/standalone/__init__.py +0 -0
  379. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/standalone/fixtures.py +0 -0
  380. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/standalone/test_activate.py +0 -0
  381. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/standalone/test_dataframe.py +0 -0
  382. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/standalone/test_dataframe_writer.py +0 -0
  383. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/standalone/test_session.py +0 -0
  384. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/standalone/test_session_case_sensitivity.py +0 -0
  385. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/standalone/test_types.py +0 -0
  386. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/test_activate.py +0 -0
  387. {sqlframe-3.22.0 → sqlframe-3.23.0}/tests/unit/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sqlframe
3
- Version: 3.22.0
3
+ Version: 3.23.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
@@ -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.7",
23
+ "sqlglot>=24.0.0,<26.9",
24
24
  "typing_extensions",
25
25
  ],
26
26
  extras_require={
@@ -29,7 +29,7 @@ setup(
29
29
  "google-cloud-bigquery-storage>=2,<3",
30
30
  ],
31
31
  "dev": [
32
- "duckdb>=0.9,<1.2",
32
+ "duckdb>=1.2,<1.3",
33
33
  "findspark>=2,<3",
34
34
  "mypy>=1.10.0,<1.16",
35
35
  "openai>=1.30,<2",
@@ -40,7 +40,7 @@ setup(
40
40
  "pyspark>=2,<3.6",
41
41
  "pytest>=8.2.0,<8.4",
42
42
  "pytest-forked",
43
- "pytest-postgresql>=6,<7",
43
+ "pytest-postgresql>=6,<8",
44
44
  "pytest-xdist>=3.6,<3.7",
45
45
  "pre-commit>=3.7,<5",
46
46
  "ruff>=0.4.4,<0.10",
@@ -54,7 +54,7 @@ setup(
54
54
  "pymdown-extensions",
55
55
  ],
56
56
  "duckdb": [
57
- "duckdb>=0.9,<1.2",
57
+ "duckdb>=1.2,<1.3",
58
58
  "pandas>=2,<3",
59
59
  ],
60
60
  "openai": [
@@ -70,7 +70,7 @@ setup(
70
70
  "redshift_connector>=2.1.1,<2.2.0",
71
71
  ],
72
72
  "snowflake": [
73
- "snowflake-connector-python[secure-local-storage]>=3.10.0,<3.14",
73
+ "snowflake-connector-python[secure-local-storage]>=3.10.0,<3.15",
74
74
  ],
75
75
  "spark": [
76
76
  "pyspark>=2,<3.6",
@@ -1,8 +1,13 @@
1
- # file generated by setuptools_scm
1
+ # file generated by setuptools-scm
2
2
  # don't change, don't track in version control
3
+
4
+ __all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
5
+
3
6
  TYPE_CHECKING = False
4
7
  if TYPE_CHECKING:
5
- from typing import Tuple, Union
8
+ from typing import Tuple
9
+ from typing import Union
10
+
6
11
  VERSION_TUPLE = Tuple[Union[int, str], ...]
7
12
  else:
8
13
  VERSION_TUPLE = object
@@ -12,5 +17,5 @@ __version__: str
12
17
  __version_tuple__: VERSION_TUPLE
13
18
  version_tuple: VERSION_TUPLE
14
19
 
15
- __version__ = version = '3.22.0'
16
- __version_tuple__ = version_tuple = (3, 22, 0)
20
+ __version__ = version = '3.23.0'
21
+ __version_tuple__ = version_tuple = (3, 23, 0)
@@ -70,13 +70,16 @@ class _BaseCatalog(t.Generic[SESSION, DF]):
70
70
  }
71
71
 
72
72
  def add_table(
73
- self, table: exp.Table | str, column_mapping: t.Optional[ColumnMapping] = None
73
+ self,
74
+ table: exp.Table | str,
75
+ column_mapping: t.Optional[ColumnMapping] = None,
76
+ **kwargs: t.Any,
74
77
  ) -> None:
75
78
  # TODO: Making this an update or add
76
79
  table = self.ensure_table(table)
77
80
  if self._schema.find(table):
78
81
  return
79
- if not column_mapping:
82
+ if column_mapping is None:
80
83
  try:
81
84
  column_mapping = {
82
85
  normalize_string(
@@ -100,7 +103,7 @@ class _BaseCatalog(t.Generic[SESSION, DF]):
100
103
  if column.this.quoted:
101
104
  self._quoted_columns[table].append(column.this.name)
102
105
 
103
- self._schema.add_table(table, column_mapping, dialect=self.session.input_dialect)
106
+ self._schema.add_table(table, column_mapping, dialect=self.session.input_dialect, **kwargs)
104
107
 
105
108
  def getDatabase(self, dbName: str) -> Database:
106
109
  """Get the database with the specified name.
@@ -856,15 +856,21 @@ def expr(str: str) -> Column:
856
856
 
857
857
  @meta(unsupported_engines=["postgres"])
858
858
  def struct(col: t.Union[ColumnOrName, t.Iterable[ColumnOrName]], *cols: ColumnOrName) -> Column:
859
- from sqlframe.base.function_alternatives import struct_with_eq
860
-
861
859
  session = _get_session()
862
-
863
- if session._is_snowflake:
864
- return struct_with_eq(col, *cols)
865
-
866
- columns = ensure_list(col) + list(cols)
867
- return Column.invoke_expression_over_column(None, expression.Struct, expressions=columns)
860
+ col_func = get_func_from_session("col")
861
+
862
+ columns = [col_func(x) for x in ensure_list(col) + list(cols)]
863
+ expressions = []
864
+ for column in columns:
865
+ expressions.append(
866
+ expression.PropertyEQ(
867
+ this=expression.parse_identifier(
868
+ column.alias_or_name, dialect=session.input_dialect
869
+ ),
870
+ expression=column.column_expression,
871
+ )
872
+ )
873
+ return Column(expression.Struct(expressions=expressions))
868
874
 
869
875
 
870
876
  @meta(unsupported_engines=["bigquery", "duckdb", "postgres", "snowflake"])
@@ -279,15 +279,6 @@ def verify_openai_installed():
279
279
  )
280
280
 
281
281
 
282
- def verify_numpy_installed():
283
- try:
284
- import numpy # noqa
285
- except ImportError:
286
- raise ImportError(
287
- """Numpy is required for this functionality. `pip install "sqlframe[pandas]"` (also include your engine if needed) to install pandas/numpy."""
288
- )
289
-
290
-
291
282
  def quote_preserving_alias_or_name(col: t.Union[exp.Column, exp.Alias]) -> str:
292
283
  from sqlframe.base.session import _BaseSession
293
284
 
@@ -82,37 +82,26 @@ class WindowSpec:
82
82
  def _calc_start_end(
83
83
  self, start: int, end: int
84
84
  ) -> t.Dict[str, t.Optional[t.Union[str, exp.Expression]]]:
85
- kwargs: t.Dict[str, t.Optional[t.Union[str, exp.Expression]]] = {
86
- "start_side": None,
87
- "end_side": None,
85
+ def get_value_and_side(x: int) -> t.Tuple[t.Union[str, exp.Expression], t.Optional[str]]:
86
+ if x == Window.currentRow:
87
+ return "CURRENT ROW", None
88
+ if x < 0:
89
+ side = "PRECEDING"
90
+ value = "UNBOUNDED" if x <= Window.unboundedPreceding else F.lit(abs(x)).expression
91
+ return value, side
92
+ else:
93
+ side = "FOLLOWING"
94
+ value = "UNBOUNDED" if x >= Window.unboundedFollowing else F.lit(x).expression
95
+ return value, side
96
+
97
+ start, start_side = get_value_and_side(start) # type: ignore
98
+ end, end_side = get_value_and_side(end) # type: ignore
99
+ return {
100
+ "start": start, # type: ignore
101
+ "start_side": start_side,
102
+ "end": end, # type: ignore
103
+ "end_side": end_side,
88
104
  }
89
- if start == Window.currentRow:
90
- kwargs["start"] = "CURRENT ROW"
91
- else:
92
- kwargs = {
93
- **kwargs,
94
- **{
95
- "start_side": "PRECEDING",
96
- "start": (
97
- "UNBOUNDED"
98
- if start <= Window.unboundedPreceding
99
- else F.lit(start).expression
100
- ),
101
- },
102
- }
103
- if end == Window.currentRow:
104
- kwargs["end"] = "CURRENT ROW"
105
- else:
106
- kwargs = {
107
- **kwargs,
108
- **{
109
- "end_side": "FOLLOWING",
110
- "end": (
111
- "UNBOUNDED" if end >= Window.unboundedFollowing else F.lit(end).expression
112
- ),
113
- },
114
- }
115
- return kwargs
116
105
 
117
106
  def rowsBetween(self, start: int, end: int) -> WindowSpec:
118
107
  window_spec = self.copy()
@@ -4,7 +4,7 @@ import typing as t
4
4
  from functools import cached_property
5
5
 
6
6
  from sqlframe.base.session import _BaseSession
7
- from sqlframe.base.util import soundex, verify_numpy_installed
7
+ from sqlframe.base.util import soundex
8
8
  from sqlframe.duckdb.catalog import DuckDBCatalog
9
9
  from sqlframe.duckdb.dataframe import DuckDBDataFrame
10
10
  from sqlframe.duckdb.readwriter import (
@@ -46,8 +46,6 @@ class DuckDBSession(
46
46
  if not hasattr(self, "_conn"):
47
47
  conn = conn or duckdb.connect()
48
48
  try:
49
- # Creating a function requires numpy to be installed so if they don't have it, we'll just skip it
50
- verify_numpy_installed()
51
49
  conn.create_function("SOUNDEX", lambda x: soundex(x), return_type=VARCHAR)
52
50
  except ImportError:
53
51
  pass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sqlframe
3
- Version: 3.22.0
3
+ Version: 3.23.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.7,>=24.0.0
2
+ sqlglot<26.9,>=24.0.0
3
3
  typing_extensions
4
4
 
5
5
  [bigquery]
@@ -10,7 +10,7 @@ google-cloud-bigquery[pandas]<4,>=3
10
10
  databricks-sql-connector<5,>=3.6
11
11
 
12
12
  [dev]
13
- duckdb<1.2,>=0.9
13
+ duckdb<1.3,>=1.2
14
14
  findspark<3,>=2
15
15
  mypy<1.16,>=1.10.0
16
16
  openai<2,>=1.30
@@ -21,7 +21,7 @@ psycopg<4,>=3.1
21
21
  pyarrow<20,>=10
22
22
  pyspark<3.6,>=2
23
23
  pytest-forked
24
- pytest-postgresql<7,>=6
24
+ pytest-postgresql<8,>=6
25
25
  pytest-xdist<3.7,>=3.6
26
26
  pytest<8.4,>=8.2.0
27
27
  ruff<0.10,>=0.4.4
@@ -35,7 +35,7 @@ mkdocs==1.4.2
35
35
  pymdown-extensions
36
36
 
37
37
  [duckdb]
38
- duckdb<1.2,>=0.9
38
+ duckdb<1.3,>=1.2
39
39
  pandas<3,>=2
40
40
 
41
41
  [openai]
@@ -51,7 +51,7 @@ psycopg2<3,>=2.8
51
51
  redshift_connector<2.2.0,>=2.1.1
52
52
 
53
53
  [snowflake]
54
- snowflake-connector-python[secure-local-storage]<3.14,>=3.10.0
54
+ snowflake-connector-python[secure-local-storage]<3.15,>=3.10.0
55
55
 
56
56
  [spark]
57
57
  pyspark<3.6,>=2
@@ -57,25 +57,15 @@ def test_set_current_database(duckdb_session: DuckDBSession):
57
57
 
58
58
  def test_list_databases(duckdb_session: DuckDBSession):
59
59
  assert sorted(duckdb_session.catalog.listDatabases(), key=lambda x: (x.catalog, x.name)) == [
60
- Database(name="information_schema", catalog="catalog1", description=None, locationUri=""),
61
60
  Database(name="main", catalog="catalog1", description=None, locationUri=""),
62
- Database(name="pg_catalog", catalog="catalog1", description=None, locationUri=""),
63
- Database(name="information_schema", catalog="catalog2", description=None, locationUri=""),
64
61
  Database(name="main", catalog="catalog2", description=None, locationUri=""),
65
- Database(name="pg_catalog", catalog="catalog2", description=None, locationUri=""),
66
62
  Database(name="db1", catalog="default", description=None, locationUri=""),
67
- Database(name="information_schema", catalog="default", description=None, locationUri=""),
68
63
  Database(name="main", catalog="default", description=None, locationUri=""),
69
- Database(name="pg_catalog", catalog="default", description=None, locationUri=""),
70
- Database(name="information_schema", catalog="memory", description=None, locationUri=""),
71
64
  Database(name="main", catalog="memory", description=None, locationUri=""),
72
- Database(name="pg_catalog", catalog="memory", description=None, locationUri=""),
73
65
  Database(name="information_schema", catalog="system", description=None, locationUri=""),
74
66
  Database(name="main", catalog="system", description=None, locationUri=""),
75
67
  Database(name="pg_catalog", catalog="system", description=None, locationUri=""),
76
- Database(name="information_schema", catalog="temp", description=None, locationUri=""),
77
68
  Database(name="main", catalog="temp", description=None, locationUri=""),
78
- Database(name="pg_catalog", catalog="temp", description=None, locationUri=""),
79
69
  ]
80
70
 
81
71
 
@@ -99,8 +89,8 @@ def test_get_database_name_only(duckdb_session: DuckDBSession):
99
89
 
100
90
 
101
91
  def test_get_database_name_and_catalog(duckdb_session: DuckDBSession):
102
- assert duckdb_session.catalog.getDatabase("catalog1.information_schema") == Database(
103
- name="information_schema", catalog="catalog1", description=None, locationUri=""
92
+ assert duckdb_session.catalog.getDatabase("system.information_schema") == Database(
93
+ name="information_schema", catalog="system", description=None, locationUri=""
104
94
  )
105
95
 
106
96
 
@@ -1,3 +1,7 @@
1
+ import os
2
+
3
+ import pytest
4
+
1
5
  from sqlframe.base.types import Row
2
6
  from sqlframe.duckdb import DuckDBSession
3
7
  from sqlframe.duckdb import functions as F
@@ -102,6 +106,10 @@ def test_employee_extra_line_csv_multiple(duckdb_session: DuckDBSession):
102
106
 
103
107
 
104
108
  def test_employee_delta(duckdb_session: DuckDBSession):
109
+ if os.environ.get("CI"):
110
+ pytest.skip(
111
+ "DuckDB Delta is not working in CI with DuckDB 1.2.1. Error: `duckdb.duckdb.Error: An error occurred while trying to automatically install the required extension 'delta'`"
112
+ )
105
113
  df = duckdb_session.read.load(
106
114
  "tests/fixtures/employee_delta",
107
115
  format="delta",
@@ -1062,8 +1062,23 @@ def test_struct(get_session_and_func):
1062
1062
  if not isinstance(session, SnowflakeSession)
1063
1063
  else [Row(value={"age": 2, "name": "Alice"}), Row(value={"age": 5, "name": "Bob"})]
1064
1064
  )
1065
- assert df.select(struct("age", "name").alias("struct")).collect() == expected
1066
- assert df.select(struct([df.age, df.name]).alias("struct")).collect() == expected
1065
+ expected_field_names = ["age", "name"]
1066
+ result = df.select(struct("age", "name").alias("struct")).collect()
1067
+ assert result == expected
1068
+ if isinstance(session, (SparkSession, PySparkSession)):
1069
+ pass
1070
+ elif isinstance(session, SnowflakeSession):
1071
+ assert list(result[0][0]) == expected_field_names
1072
+ else:
1073
+ assert result[0][0]._unique_field_names == expected_field_names
1074
+ result = df.select(struct([df.age, df.name]).alias("struct")).collect()
1075
+ assert result == expected
1076
+ if isinstance(session, (SparkSession, PySparkSession)):
1077
+ pass
1078
+ elif isinstance(session, SnowflakeSession):
1079
+ assert list(result[0][0]) == expected_field_names
1080
+ else:
1081
+ assert result[0][0]._unique_field_names == expected_field_names
1067
1082
 
1068
1083
 
1069
1084
  def test_greatest(get_session_and_func):
@@ -1576,7 +1591,7 @@ def test_hash(get_session_and_func):
1576
1591
  df = session.createDataFrame([("ABC", "DEF")], ["c1", "c2"])
1577
1592
  if isinstance(session, DuckDBSession):
1578
1593
  assert df.select(hash("c1").alias("hash")).first()[0] == 1241521928161919141
1579
- assert df.select(hash("c1", "c2").alias("hash")).first()[0] == 13305036188712072380
1594
+ assert df.select(hash("c1", "c2").alias("hash")).first()[0] == 7524280102280623017
1580
1595
  # Bigquery only supports hashing a single column
1581
1596
  elif isinstance(session, BigQuerySession):
1582
1597
  assert df.select(hash("c1").alias("hash")).first()[0] == 228873345217803866
@@ -4879,9 +4894,9 @@ def test_try_element_at(get_session_and_func, get_func):
4879
4894
  else:
4880
4895
  assert df.select(try_element_at(df.data, lit(-1)).alias("r")).first()[0] == "c"
4881
4896
  df = session.createDataFrame([({"a": 1.0, "b": 2.0},)], ["data"])
4882
- if isinstance(session, DuckDBSession):
4883
- assert df.select(try_element_at(df.data, lit("a")).alias("r")).first()[0] == [1.0]
4884
- elif isinstance(session, PostgresSession):
4897
+ # if isinstance(session, DuckDBSession):
4898
+ # assert df.select(try_element_at(df.data, lit("a")).alias("r")).first()[0] == [1.0]
4899
+ if isinstance(session, PostgresSession):
4885
4900
  pass
4886
4901
  else:
4887
4902
  assert df.select(try_element_at(df.data, lit("a")).alias("r")).first()[0] == 1.0
@@ -6,8 +6,10 @@ import pandas as pd
6
6
  import pytest
7
7
  from _pytest.fixtures import FixtureRequest
8
8
  from pyspark.sql import DataFrame as PySparkDataFrame
9
+ from pyspark.sql import Window
9
10
  from pyspark.sql import functions as F
10
11
 
12
+ from sqlframe.standalone import Window as SWindow
11
13
  from sqlframe.standalone import functions as SF
12
14
  from sqlframe.standalone.dataframe import StandaloneDataFrame
13
15
  from tests.integration.fixtures import StandaloneSession, is_snowflake
@@ -2548,3 +2550,87 @@ def test_full_outer_nulls_no_match(
2548
2550
  dfs = dfs_concept_1.join(dfs_concept_2, on="col1", how="outer")
2549
2551
 
2550
2552
  compare_frames(df, dfs, compare_schema=False)
2553
+
2554
+
2555
+ # https://github.com/eakmanrq/sqlframe/issues/317
2556
+ def test_rows_between_negative_start(
2557
+ pyspark_employee: PySparkDataFrame,
2558
+ get_df: t.Callable[[str], BaseDataFrame],
2559
+ compare_frames: t.Callable,
2560
+ ):
2561
+ session = pyspark_employee.sparkSession
2562
+ df = session.createDataFrame(
2563
+ pd.DataFrame(
2564
+ {"store": [1, 1, 1, 2, 2, 2, 2], "price": [1, 2, 3, 4, 3, 2, 1], "date": list(range(7))}
2565
+ )
2566
+ )
2567
+ window = Window().partitionBy("store").orderBy("date").rowsBetween(-1, 1)
2568
+ df = df.withColumn("rolling_price", F.mean("price").over(window))
2569
+
2570
+ employee = get_df("employee")
2571
+ sf_session = employee.session
2572
+ dfs = sf_session.createDataFrame(
2573
+ pd.DataFrame(
2574
+ {"store": [1, 1, 1, 2, 2, 2, 2], "price": [1, 2, 3, 4, 3, 2, 1], "date": list(range(7))}
2575
+ )
2576
+ )
2577
+ swindow = SWindow().partitionBy("store").orderBy("date").rowsBetween(-1, 1)
2578
+ dfs = dfs.withColumn("rolling_price", SF.mean("price").over(swindow))
2579
+
2580
+ compare_frames(df, dfs, compare_schema=False)
2581
+
2582
+
2583
+ # https://github.com/eakmanrq/sqlframe/issues/317
2584
+ def test_rows_between_negative_end(
2585
+ pyspark_employee: PySparkDataFrame,
2586
+ get_df: t.Callable[[str], BaseDataFrame],
2587
+ compare_frames: t.Callable,
2588
+ ):
2589
+ session = pyspark_employee.sparkSession
2590
+ df = session.createDataFrame(
2591
+ pd.DataFrame(
2592
+ {"store": [1, 1, 1, 2, 2, 2, 2], "price": [1, 2, 3, 4, 3, 2, 1], "date": list(range(7))}
2593
+ )
2594
+ )
2595
+ window = Window().partitionBy("store").orderBy("date").rowsBetween(-2, -1)
2596
+ df = df.withColumn("rolling_price", F.mean("price").over(window))
2597
+
2598
+ employee = get_df("employee")
2599
+ sf_session = employee.session
2600
+ dfs = sf_session.createDataFrame(
2601
+ pd.DataFrame(
2602
+ {"store": [1, 1, 1, 2, 2, 2, 2], "price": [1, 2, 3, 4, 3, 2, 1], "date": list(range(7))}
2603
+ )
2604
+ )
2605
+ swindow = SWindow().partitionBy("store").orderBy("date").rowsBetween(-2, -1)
2606
+ dfs = dfs.withColumn("rolling_price", SF.mean("price").over(swindow))
2607
+
2608
+ compare_frames(df, dfs, compare_schema=False)
2609
+
2610
+
2611
+ # https://github.com/eakmanrq/sqlframe/issues/317
2612
+ def test_rows_between_positive_both_start_end(
2613
+ pyspark_employee: PySparkDataFrame,
2614
+ get_df: t.Callable[[str], BaseDataFrame],
2615
+ compare_frames: t.Callable,
2616
+ ):
2617
+ session = pyspark_employee.sparkSession
2618
+ df = session.createDataFrame(
2619
+ pd.DataFrame(
2620
+ {"store": [1, 1, 1, 2, 2, 2, 2], "price": [1, 2, 3, 4, 3, 2, 1], "date": list(range(7))}
2621
+ )
2622
+ )
2623
+ window = Window().partitionBy("store").orderBy("date").rowsBetween(1, 2)
2624
+ df = df.withColumn("rolling_price", F.mean("price").over(window))
2625
+
2626
+ employee = get_df("employee")
2627
+ sf_session = employee.session
2628
+ dfs = sf_session.createDataFrame(
2629
+ pd.DataFrame(
2630
+ {"store": [1, 1, 1, 2, 2, 2, 2], "price": [1, 2, 3, 4, 3, 2, 1], "date": list(range(7))}
2631
+ )
2632
+ )
2633
+ swindow = SWindow().partitionBy("store").orderBy("date").rowsBetween(1, 2)
2634
+ dfs = dfs.withColumn("rolling_price", SF.mean("price").over(swindow))
2635
+
2636
+ compare_frames(df, dfs, compare_schema=False)
@@ -207,7 +207,9 @@ def test_over():
207
207
  assert (
208
208
  (
209
209
  F.sum("cola").over(
210
- Window.partitionBy("colb").orderBy("colc").rowsBetween(1, Window.unboundedFollowing)
210
+ Window.partitionBy("colb")
211
+ .orderBy("colc")
212
+ .rowsBetween(-1, Window.unboundedFollowing)
211
213
  )
212
214
  ).sql()
213
215
  == "SUM(cola) OVER (PARTITION BY colb ORDER BY colc ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING)"
@@ -217,7 +219,7 @@ def test_over():
217
219
  F.sum("cola").over(
218
220
  Window.partitionBy("colb")
219
221
  .orderBy("colc")
220
- .rangeBetween(1, Window.unboundedFollowing)
222
+ .rangeBetween(-1, Window.unboundedFollowing)
221
223
  )
222
224
  ).sql()
223
225
  == "SUM(cola) OVER (PARTITION BY colb ORDER BY colc RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING)"
@@ -1070,10 +1070,13 @@ def test_expr():
1070
1070
  @pytest.mark.parametrize(
1071
1071
  "expression, expected",
1072
1072
  [
1073
- (SF.struct("cola", "colb", "colc"), "STRUCT(cola, colb, colc)"),
1074
- (SF.struct(SF.col("cola"), SF.col("colb"), SF.col("colc")), "STRUCT(cola, colb, colc)"),
1075
- (SF.struct("cola"), "STRUCT(cola)"),
1076
- (SF.struct(["cola", "colb", "colc"]), "STRUCT(cola, colb, colc)"),
1073
+ (SF.struct("cola", "colb", "colc"), "STRUCT(cola AS cola, colb AS colb, colc AS colc)"),
1074
+ (
1075
+ SF.struct(SF.col("cola"), SF.col("colb"), SF.col("colc")),
1076
+ "STRUCT(cola AS cola, colb AS colb, colc AS colc)",
1077
+ ),
1078
+ (SF.struct("cola"), "STRUCT(cola AS cola)"),
1079
+ (SF.struct(["cola", "colb", "colc"]), "STRUCT(cola AS cola, colb AS colb, colc AS colc)"),
1077
1080
  ],
1078
1081
  )
1079
1082
  def test_struct(expression, expected):
@@ -11,29 +11,41 @@ from sqlframe.standalone.window import Window, WindowSpec
11
11
  (Window.partitionBy(F.col("cola"), F.col("colb")), "OVER (PARTITION BY cola, colb)"),
12
12
  (WindowSpec().orderBy("cola", "colb"), "OVER (ORDER BY cola, colb)"),
13
13
  (Window.orderBy("cola", "colb"), "OVER (ORDER BY cola, colb)"),
14
- (WindowSpec().rowsBetween(3, 5), "OVER (ROWS BETWEEN 3 PRECEDING AND 5 FOLLOWING)"),
15
- (Window.rowsBetween(3, 5), "OVER (ROWS BETWEEN 3 PRECEDING AND 5 FOLLOWING)"),
16
- (WindowSpec().rangeBetween(3, 5), "OVER (RANGE BETWEEN 3 PRECEDING AND 5 FOLLOWING)"),
17
- (Window.rangeBetween(3, 5), "OVER (RANGE BETWEEN 3 PRECEDING AND 5 FOLLOWING)"),
14
+ (WindowSpec().rowsBetween(3, 5), "OVER (ROWS BETWEEN 3 FOLLOWING AND 5 FOLLOWING)"),
15
+ (Window.rowsBetween(3, 5), "OVER (ROWS BETWEEN 3 FOLLOWING AND 5 FOLLOWING)"),
16
+ (WindowSpec().rangeBetween(3, 5), "OVER (RANGE BETWEEN 3 FOLLOWING AND 5 FOLLOWING)"),
17
+ (Window.rangeBetween(3, 5), "OVER (RANGE BETWEEN 3 FOLLOWING AND 5 FOLLOWING)"),
18
18
  (
19
19
  Window.rowsBetween(Window.unboundedPreceding, 2),
20
20
  "OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING)",
21
21
  ),
22
22
  (
23
23
  Window.rowsBetween(1, Window.unboundedFollowing),
24
- "OVER (ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING)",
24
+ "OVER (ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)",
25
25
  ),
26
26
  (
27
27
  Window.rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing),
28
28
  "OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)",
29
29
  ),
30
+ (
31
+ Window.rowsBetween(-1, Window.currentRow),
32
+ "OVER (ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)",
33
+ ),
34
+ (
35
+ Window.rowsBetween(-1, 2),
36
+ "OVER (ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING)",
37
+ ),
38
+ (
39
+ Window.rowsBetween(-2, -1),
40
+ "OVER (ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING)",
41
+ ),
30
42
  (
31
43
  Window.rangeBetween(Window.unboundedPreceding, 2),
32
44
  "OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING)",
33
45
  ),
34
46
  (
35
47
  Window.rangeBetween(1, Window.unboundedFollowing),
36
- "OVER (RANGE BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING)",
48
+ "OVER (RANGE BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)",
37
49
  ),
38
50
  (
39
51
  Window.rangeBetween(Window.unboundedPreceding, Window.unboundedFollowing),
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