sqlframe 3.4.0__tar.gz → 3.5.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 (355) hide show
  1. {sqlframe-3.4.0 → sqlframe-3.5.0}/PKG-INFO +1 -1
  2. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/duckdb.md +1 -0
  3. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/snowflake.md +1 -0
  4. {sqlframe-3.4.0 → sqlframe-3.5.0}/setup.py +5 -5
  5. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/_version.py +2 -2
  6. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/column.py +4 -1
  7. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/dataframe.py +33 -9
  8. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/function_alternatives.py +2 -2
  9. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/functions.py +6 -4
  10. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/duckdb/functions.pyi +1 -0
  11. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/snowflake/functions.pyi +1 -0
  12. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe.egg-info/PKG-INFO +1 -1
  13. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe.egg-info/requires.txt +5 -5
  14. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/test_engine_column.py +18 -0
  15. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/test_int_dataframe.py +67 -0
  16. {sqlframe-3.4.0 → sqlframe-3.5.0}/.github/CODEOWNERS +0 -0
  17. {sqlframe-3.4.0 → sqlframe-3.5.0}/.github/workflows/main.workflow.yaml +0 -0
  18. {sqlframe-3.4.0 → sqlframe-3.5.0}/.github/workflows/publish.workflow.yaml +0 -0
  19. {sqlframe-3.4.0 → sqlframe-3.5.0}/.gitignore +0 -0
  20. {sqlframe-3.4.0 → sqlframe-3.5.0}/.pre-commit-config.yaml +0 -0
  21. {sqlframe-3.4.0 → sqlframe-3.5.0}/.readthedocs.yaml +0 -0
  22. {sqlframe-3.4.0 → sqlframe-3.5.0}/LICENSE +0 -0
  23. {sqlframe-3.4.0 → sqlframe-3.5.0}/Makefile +0 -0
  24. {sqlframe-3.4.0 → sqlframe-3.5.0}/README.md +0 -0
  25. {sqlframe-3.4.0 → sqlframe-3.5.0}/blogs/add_chatgpt_support.md +0 -0
  26. {sqlframe-3.4.0 → sqlframe-3.5.0}/blogs/images/add_chatgpt_support/adding_ai_to_meal.jpeg +0 -0
  27. {sqlframe-3.4.0 → sqlframe-3.5.0}/blogs/images/add_chatgpt_support/hype_train.gif +0 -0
  28. {sqlframe-3.4.0 → sqlframe-3.5.0}/blogs/images/add_chatgpt_support/marvin_paranoid_robot.gif +0 -0
  29. {sqlframe-3.4.0 → sqlframe-3.5.0}/blogs/images/add_chatgpt_support/nonsense_sql.png +0 -0
  30. {sqlframe-3.4.0 → sqlframe-3.5.0}/blogs/images/add_chatgpt_support/openai_full_rewrite.png +0 -0
  31. {sqlframe-3.4.0 → sqlframe-3.5.0}/blogs/images/add_chatgpt_support/openai_replacing_cte_names.png +0 -0
  32. {sqlframe-3.4.0 → sqlframe-3.5.0}/blogs/images/add_chatgpt_support/sqlglot_optimized_code.png +0 -0
  33. {sqlframe-3.4.0 → sqlframe-3.5.0}/blogs/images/add_chatgpt_support/sunny_shake_head_no.gif +0 -0
  34. {sqlframe-3.4.0 → sqlframe-3.5.0}/blogs/images/but_wait_theres_more.gif +0 -0
  35. {sqlframe-3.4.0 → sqlframe-3.5.0}/blogs/images/cake.gif +0 -0
  36. {sqlframe-3.4.0 → sqlframe-3.5.0}/blogs/images/you_get_pyspark_api.gif +0 -0
  37. {sqlframe-3.4.0 → sqlframe-3.5.0}/blogs/sqlframe_universal_dataframe_api.md +0 -0
  38. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/bigquery.md +0 -0
  39. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/configuration.md +0 -0
  40. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/docs/bigquery.md +0 -0
  41. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/docs/duckdb.md +0 -0
  42. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/docs/images/SF.png +0 -0
  43. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/docs/images/favicon.png +0 -0
  44. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/docs/images/favicon_old.png +0 -0
  45. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/docs/images/sqlframe_diagram.png +0 -0
  46. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/docs/images/sqlframe_logo.png +0 -0
  47. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/docs/postgres.md +0 -0
  48. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/images/SF.png +0 -0
  49. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/images/favicon.png +0 -0
  50. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/images/favicon_old.png +0 -0
  51. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/images/sqlframe_diagram.png +0 -0
  52. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/images/sqlframe_logo.png +0 -0
  53. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/index.md +0 -0
  54. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/postgres.md +0 -0
  55. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/requirements.txt +0 -0
  56. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/spark.md +0 -0
  57. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/standalone.md +0 -0
  58. {sqlframe-3.4.0 → sqlframe-3.5.0}/docs/stylesheets/extra.css +0 -0
  59. {sqlframe-3.4.0 → sqlframe-3.5.0}/mkdocs.yml +0 -0
  60. {sqlframe-3.4.0 → sqlframe-3.5.0}/pytest.ini +0 -0
  61. {sqlframe-3.4.0 → sqlframe-3.5.0}/renovate.json +0 -0
  62. {sqlframe-3.4.0 → sqlframe-3.5.0}/setup.cfg +0 -0
  63. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/LICENSE +0 -0
  64. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/__init__.py +0 -0
  65. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/__init__.py +0 -0
  66. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/_typing.py +0 -0
  67. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/catalog.py +0 -0
  68. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/decorators.py +0 -0
  69. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/exceptions.py +0 -0
  70. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/group.py +0 -0
  71. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/mixins/__init__.py +0 -0
  72. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/mixins/catalog_mixins.py +0 -0
  73. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/mixins/dataframe_mixins.py +0 -0
  74. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/mixins/readwriter_mixins.py +0 -0
  75. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/normalize.py +0 -0
  76. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/operations.py +0 -0
  77. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/readerwriter.py +0 -0
  78. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/session.py +0 -0
  79. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/transforms.py +0 -0
  80. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/types.py +0 -0
  81. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/udf.py +0 -0
  82. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/util.py +0 -0
  83. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/base/window.py +0 -0
  84. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/bigquery/__init__.py +0 -0
  85. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/bigquery/catalog.py +0 -0
  86. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/bigquery/column.py +0 -0
  87. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/bigquery/dataframe.py +0 -0
  88. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/bigquery/functions.py +0 -0
  89. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/bigquery/functions.pyi +0 -0
  90. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/bigquery/group.py +0 -0
  91. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/bigquery/readwriter.py +0 -0
  92. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/bigquery/session.py +0 -0
  93. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/bigquery/types.py +0 -0
  94. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/bigquery/udf.py +0 -0
  95. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/bigquery/window.py +0 -0
  96. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/duckdb/__init__.py +0 -0
  97. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/duckdb/catalog.py +0 -0
  98. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/duckdb/column.py +0 -0
  99. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/duckdb/dataframe.py +0 -0
  100. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/duckdb/functions.py +0 -0
  101. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/duckdb/group.py +0 -0
  102. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/duckdb/readwriter.py +0 -0
  103. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/duckdb/session.py +0 -0
  104. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/duckdb/types.py +0 -0
  105. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/duckdb/udf.py +0 -0
  106. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/duckdb/window.py +0 -0
  107. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/postgres/__init__.py +0 -0
  108. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/postgres/catalog.py +0 -0
  109. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/postgres/column.py +0 -0
  110. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/postgres/dataframe.py +0 -0
  111. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/postgres/functions.py +0 -0
  112. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/postgres/functions.pyi +0 -0
  113. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/postgres/group.py +0 -0
  114. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/postgres/readwriter.py +0 -0
  115. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/postgres/session.py +0 -0
  116. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/postgres/types.py +0 -0
  117. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/postgres/udf.py +0 -0
  118. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/postgres/window.py +0 -0
  119. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/redshift/__init__.py +0 -0
  120. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/redshift/catalog.py +0 -0
  121. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/redshift/column.py +0 -0
  122. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/redshift/dataframe.py +0 -0
  123. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/redshift/functions.py +0 -0
  124. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/redshift/group.py +0 -0
  125. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/redshift/readwriter.py +0 -0
  126. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/redshift/session.py +0 -0
  127. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/redshift/types.py +0 -0
  128. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/redshift/udf.py +0 -0
  129. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/redshift/window.py +0 -0
  130. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/snowflake/__init__.py +0 -0
  131. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/snowflake/catalog.py +0 -0
  132. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/snowflake/column.py +0 -0
  133. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/snowflake/dataframe.py +0 -0
  134. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/snowflake/functions.py +0 -0
  135. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/snowflake/group.py +0 -0
  136. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/snowflake/readwriter.py +0 -0
  137. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/snowflake/session.py +0 -0
  138. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/snowflake/types.py +0 -0
  139. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/snowflake/udf.py +0 -0
  140. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/snowflake/window.py +0 -0
  141. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/spark/__init__.py +0 -0
  142. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/spark/catalog.py +0 -0
  143. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/spark/column.py +0 -0
  144. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/spark/dataframe.py +0 -0
  145. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/spark/functions.py +0 -0
  146. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/spark/functions.pyi +0 -0
  147. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/spark/group.py +0 -0
  148. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/spark/readwriter.py +0 -0
  149. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/spark/session.py +0 -0
  150. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/spark/types.py +0 -0
  151. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/spark/udf.py +0 -0
  152. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/spark/window.py +0 -0
  153. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/standalone/__init__.py +0 -0
  154. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/standalone/catalog.py +0 -0
  155. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/standalone/column.py +0 -0
  156. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/standalone/dataframe.py +0 -0
  157. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/standalone/functions.py +0 -0
  158. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/standalone/group.py +0 -0
  159. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/standalone/readwriter.py +0 -0
  160. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/standalone/session.py +0 -0
  161. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/standalone/types.py +0 -0
  162. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/standalone/udf.py +0 -0
  163. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/standalone/window.py +0 -0
  164. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/testing/__init__.py +0 -0
  165. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe/testing/utils.py +0 -0
  166. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe.egg-info/SOURCES.txt +0 -0
  167. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe.egg-info/dependency_links.txt +0 -0
  168. {sqlframe-3.4.0 → sqlframe-3.5.0}/sqlframe.egg-info/top_level.txt +0 -0
  169. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/__init__.py +0 -0
  170. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/common_fixtures.py +0 -0
  171. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/conftest.py +0 -0
  172. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee.csv +0 -0
  173. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee.json +0 -0
  174. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee.parquet +0 -0
  175. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee_delta/.part-00000-e5965c7b-e58f-4d3c-ad56-002876814e3a-c000.snappy.parquet.crc +0 -0
  176. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee_delta/.part-00002-3fed7f18-370f-4b16-b232-504d6194eb52-c000.snappy.parquet.crc +0 -0
  177. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee_delta/.part-00004-143c5da1-d5ab-4706-8e84-0d2a324c6894-c000.snappy.parquet.crc +0 -0
  178. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee_delta/.part-00006-64f07e25-c30e-4075-acc6-b3c69c4ce80b-c000.snappy.parquet.crc +0 -0
  179. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee_delta/.part-00008-89ccad8d-df73-4ad5-8850-82ef3884db60-c000.snappy.parquet.crc +0 -0
  180. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee_delta/.part-00010-812b3382-8c7f-4c4e-9bcd-09ce8664f6e0-c000.snappy.parquet.crc +0 -0
  181. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee_delta/_delta_log/.00000000000000000000.json.crc +0 -0
  182. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee_delta/_delta_log/00000000000000000000.json +0 -0
  183. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee_delta/part-00000-e5965c7b-e58f-4d3c-ad56-002876814e3a-c000.snappy.parquet +0 -0
  184. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee_delta/part-00002-3fed7f18-370f-4b16-b232-504d6194eb52-c000.snappy.parquet +0 -0
  185. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee_delta/part-00004-143c5da1-d5ab-4706-8e84-0d2a324c6894-c000.snappy.parquet +0 -0
  186. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee_delta/part-00006-64f07e25-c30e-4075-acc6-b3c69c4ce80b-c000.snappy.parquet +0 -0
  187. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee_delta/part-00008-89ccad8d-df73-4ad5-8850-82ef3884db60-c000.snappy.parquet +0 -0
  188. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee_delta/part-00010-812b3382-8c7f-4c4e-9bcd-09ce8664f6e0-c000.snappy.parquet +0 -0
  189. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/employee_extra_line.csv +0 -0
  190. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds1.sql +0 -0
  191. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds10.sql +0 -0
  192. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds11.sql +0 -0
  193. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds12.sql +0 -0
  194. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds13.sql +0 -0
  195. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds14.sql +0 -0
  196. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds15.sql +0 -0
  197. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds16.sql +0 -0
  198. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds17.sql +0 -0
  199. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds18.sql +0 -0
  200. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds19.sql +0 -0
  201. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds2.sql +0 -0
  202. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds20.sql +0 -0
  203. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds21.sql +0 -0
  204. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds22.sql +0 -0
  205. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds23.sql +0 -0
  206. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds24.sql +0 -0
  207. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds25.sql +0 -0
  208. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds26.sql +0 -0
  209. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds27.sql +0 -0
  210. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds28.sql +0 -0
  211. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds29.sql +0 -0
  212. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds3.sql +0 -0
  213. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds30.sql +0 -0
  214. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds31.sql +0 -0
  215. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds32.sql +0 -0
  216. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds33.sql +0 -0
  217. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds34.sql +0 -0
  218. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds35.sql +0 -0
  219. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds36.sql +0 -0
  220. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds37.sql +0 -0
  221. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds38.sql +0 -0
  222. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds39.sql +0 -0
  223. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds4.sql +0 -0
  224. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds40.sql +0 -0
  225. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds41.sql +0 -0
  226. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds42.sql +0 -0
  227. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds43.sql +0 -0
  228. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds44.sql +0 -0
  229. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds45.sql +0 -0
  230. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds46.sql +0 -0
  231. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds47.sql +0 -0
  232. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds48.sql +0 -0
  233. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds49.sql +0 -0
  234. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds5.sql +0 -0
  235. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds50.sql +0 -0
  236. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds51.sql +0 -0
  237. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds52.sql +0 -0
  238. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds53.sql +0 -0
  239. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds54.sql +0 -0
  240. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds55.sql +0 -0
  241. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds56.sql +0 -0
  242. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds57.sql +0 -0
  243. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds58.sql +0 -0
  244. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds59.sql +0 -0
  245. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds6.sql +0 -0
  246. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds60.sql +0 -0
  247. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds61.sql +0 -0
  248. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds62.sql +0 -0
  249. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds63.sql +0 -0
  250. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds64.sql +0 -0
  251. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds65.sql +0 -0
  252. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds66.sql +0 -0
  253. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds67.sql +0 -0
  254. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds68.sql +0 -0
  255. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds69.sql +0 -0
  256. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds7.sql +0 -0
  257. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds70.sql +0 -0
  258. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds71.sql +0 -0
  259. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds72.sql +0 -0
  260. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds73.sql +0 -0
  261. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds74.sql +0 -0
  262. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds75.sql +0 -0
  263. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds76.sql +0 -0
  264. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds77.sql +0 -0
  265. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds78.sql +0 -0
  266. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds79.sql +0 -0
  267. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds8.sql +0 -0
  268. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds80.sql +0 -0
  269. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds81.sql +0 -0
  270. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds82.sql +0 -0
  271. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds83.sql +0 -0
  272. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds84.sql +0 -0
  273. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds85.sql +0 -0
  274. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds86.sql +0 -0
  275. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds87.sql +0 -0
  276. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds88.sql +0 -0
  277. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds89.sql +0 -0
  278. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds9.sql +0 -0
  279. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds90.sql +0 -0
  280. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds91.sql +0 -0
  281. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds92.sql +0 -0
  282. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds93.sql +0 -0
  283. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds94.sql +0 -0
  284. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds95.sql +0 -0
  285. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds96.sql +0 -0
  286. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds97.sql +0 -0
  287. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds98.sql +0 -0
  288. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/fixtures/tpcds/tpcds99.sql +0 -0
  289. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/__init__.py +0 -0
  290. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/__init__.py +0 -0
  291. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/bigquery/__init__.py +0 -0
  292. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/bigquery/test_bigquery_catalog.py +0 -0
  293. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/bigquery/test_bigquery_dataframe.py +0 -0
  294. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/bigquery/test_bigquery_session.py +0 -0
  295. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/duck/__init__.py +0 -0
  296. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/duck/test_duckdb_activate.py +0 -0
  297. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/duck/test_duckdb_catalog.py +0 -0
  298. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/duck/test_duckdb_dataframe.py +0 -0
  299. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/duck/test_duckdb_reader.py +0 -0
  300. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/duck/test_duckdb_session.py +0 -0
  301. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/duck/test_duckdb_udf.py +0 -0
  302. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/duck/test_tpcds.py +0 -0
  303. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/postgres/__init__.py +0 -0
  304. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/postgres/test_postgres_activate.py +0 -0
  305. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/postgres/test_postgres_catalog.py +0 -0
  306. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/postgres/test_postgres_dataframe.py +0 -0
  307. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/postgres/test_postgres_session.py +0 -0
  308. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/redshift/__init__.py +0 -0
  309. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/redshift/test_redshift_catalog.py +0 -0
  310. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/redshift/test_redshift_session.py +0 -0
  311. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/snowflake/__init__.py +0 -0
  312. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/snowflake/test_snowflake_catalog.py +0 -0
  313. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/snowflake/test_snowflake_dataframe.py +0 -0
  314. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/snowflake/test_snowflake_session.py +0 -0
  315. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/spark/__init__.py +0 -0
  316. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/spark/test_spark_catalog.py +0 -0
  317. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/spark/test_spark_dataframe.py +0 -0
  318. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/test_engine_dataframe.py +0 -0
  319. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/test_engine_reader.py +0 -0
  320. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/test_engine_session.py +0 -0
  321. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/test_engine_writer.py +0 -0
  322. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/test_int_functions.py +0 -0
  323. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/engines/test_int_testing.py +0 -0
  324. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/fixtures.py +0 -0
  325. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/test_int_dataframe_stats.py +0 -0
  326. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/test_int_grouped_data.py +0 -0
  327. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/integration/test_int_session.py +0 -0
  328. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/types.py +0 -0
  329. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/__init__.py +0 -0
  330. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/bigquery/__init__.py +0 -0
  331. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/bigquery/test_activate.py +0 -0
  332. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/conftest.py +0 -0
  333. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/duck/__init__.py +0 -0
  334. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/duck/test_activate.py +0 -0
  335. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/postgres/__init__.py +0 -0
  336. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/postgres/test_activate.py +0 -0
  337. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/redshift/__init__.py +0 -0
  338. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/redshift/test_activate.py +0 -0
  339. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/snowflake/__init__.py +0 -0
  340. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/snowflake/test_activate.py +0 -0
  341. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/spark/__init__.py +0 -0
  342. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/spark/test_activate.py +0 -0
  343. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/standalone/__init__.py +0 -0
  344. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/standalone/fixtures.py +0 -0
  345. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/standalone/test_activate.py +0 -0
  346. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/standalone/test_column.py +0 -0
  347. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/standalone/test_dataframe.py +0 -0
  348. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/standalone/test_dataframe_writer.py +0 -0
  349. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/standalone/test_functions.py +0 -0
  350. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/standalone/test_session.py +0 -0
  351. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/standalone/test_session_case_sensitivity.py +0 -0
  352. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/standalone/test_types.py +0 -0
  353. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/standalone/test_window.py +0 -0
  354. {sqlframe-3.4.0 → sqlframe-3.5.0}/tests/unit/test_activate.py +0 -0
  355. {sqlframe-3.4.0 → sqlframe-3.5.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.4.0
3
+ Version: 3.5.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
@@ -443,6 +443,7 @@ See something that you would like to see supported? [Open an issue](https://gith
443
443
  * [sort_array](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.sort_array.html)
444
444
  * [soundex](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.soundex.html)
445
445
  * [split](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.split.html)
446
+ * [split_part](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.split_part.html)
446
447
  * [sqrt](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.sqrt.html)
447
448
  * [stddev](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.stddev.html)
448
449
  * [stddev_pop](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.stddev_pop.html)
@@ -484,6 +484,7 @@ See something that you would like to see supported? [Open an issue](https://gith
484
484
  * [soundex](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.soundex.html)
485
485
  * [split](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.split.html)
486
486
  * Regular expressions not supported
487
+ * [split_part](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.split_part.html)
487
488
  * [sqrt](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.sqrt.html)
488
489
  * [stddev](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.stddev.html)
489
490
  * [stddev_pop](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.functions.stddev_pop.html)
@@ -20,7 +20,7 @@ setup(
20
20
  python_requires=">=3.8",
21
21
  install_requires=[
22
22
  "prettytable<3.11.1",
23
- "sqlglot>=24.0.0,<25.25",
23
+ "sqlglot>=24.0.0,<25.26",
24
24
  "typing_extensions>=4.8,<5",
25
25
  ],
26
26
  extras_require={
@@ -31,8 +31,8 @@ setup(
31
31
  "dev": [
32
32
  "duckdb>=0.9,<1.2",
33
33
  "findspark>=2,<3",
34
- "mypy>=1.10.0,<1.12",
35
- "openai>=1.30,<1.52",
34
+ "mypy>=1.10.0,<1.13",
35
+ "openai>=1.30,<1.53",
36
36
  "pandas>=2,<3",
37
37
  "pandas-stubs>=2,<3",
38
38
  "psycopg>=3.1,<4",
@@ -43,7 +43,7 @@ setup(
43
43
  "pytest-xdist>=3.6,<3.7",
44
44
  "pre-commit>=3.5;python_version=='3.8'",
45
45
  "pre-commit>=3.7,<4.1;python_version>='3.9'",
46
- "ruff>=0.4.4,<0.7",
46
+ "ruff>=0.4.4,<0.8",
47
47
  "types-psycopg2>=2.9,<3",
48
48
  ],
49
49
  "docs": [
@@ -58,7 +58,7 @@ setup(
58
58
  "pandas>=2,<3",
59
59
  ],
60
60
  "openai": [
61
- "openai>=1.30,<1.52",
61
+ "openai>=1.30,<1.53",
62
62
  ],
63
63
  "pandas": [
64
64
  "pandas>=2,<3",
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '3.4.0'
16
- __version_tuple__ = version_tuple = (3, 4, 0)
15
+ __version__ = version = '3.5.0'
16
+ __version_tuple__ = version_tuple = (3, 5, 0)
@@ -338,6 +338,9 @@ class Column:
338
338
  new_expression = exp.Not(this=exp.Is(this=self.column_expression, expression=exp.Null()))
339
339
  return Column(new_expression)
340
340
 
341
+ def eqNullSafe(self, other: ColumnOrLiteral) -> Column:
342
+ return self.binary_op(exp.NullSafeEQ, other)
343
+
341
344
  def cast(
342
345
  self,
343
346
  dataType: t.Union[str, DataType, exp.DataType, exp.DataType.Type],
@@ -385,7 +388,7 @@ class Column:
385
388
 
386
389
  def isin(self, *cols: t.Union[ColumnOrLiteral, t.Iterable[ColumnOrLiteral]]):
387
390
  columns = flatten(cols) if isinstance(cols[0], (list, set, tuple)) else cols # type: ignore
388
- expressions = [self._lit(x).expression for x in columns]
391
+ expressions = [self._lit(x).expression for x in columns] # type: ignore
389
392
  return Column.invoke_expression_over_column(self, exp.In, expressions=expressions) # type: ignore
390
393
 
391
394
  def between(
@@ -15,7 +15,7 @@ from dataclasses import dataclass
15
15
 
16
16
  import sqlglot
17
17
  from prettytable import PrettyTable
18
- from sqlglot import Dialect
18
+ from sqlglot import Dialect, maybe_parse
19
19
  from sqlglot import expressions as exp
20
20
  from sqlglot import lineage as sqlglot_lineage
21
21
  from sqlglot.helper import ensure_list, flatten, object_to_dict, seq_get
@@ -460,16 +460,40 @@ class _BaseDataFrame(t.Generic[SESSION, WRITER, NA, STAT, GROUP_DATA]):
460
460
  df.expression.ctes[-1].set("cache_storage_level", storage_level)
461
461
  return df
462
462
 
463
- @classmethod
464
- def _add_ctes_to_expression(cls, expression: exp.Select, ctes: t.List[exp.CTE]) -> exp.Select:
463
+ def _add_ctes_to_expression(self, expression: exp.Select, ctes: t.List[exp.CTE]) -> exp.Select:
465
464
  expression = expression.copy()
466
465
  with_expression = expression.args.get("with")
467
466
  if with_expression:
468
467
  existing_ctes = with_expression.expressions
469
- existsing_cte_names = {x.alias_or_name for x in existing_ctes}
468
+ existing_cte_counts = {x.alias_or_name: 0 for x in existing_ctes}
469
+ replaced_cte_names = {} # type: ignore
470
470
  for cte in ctes:
471
- if cte.alias_or_name not in existsing_cte_names:
472
- existing_ctes.append(cte)
471
+ if replaced_cte_names:
472
+ cte = cte.transform(replace_id_value, replaced_cte_names) # type: ignore
473
+ if cte.alias_or_name in existing_cte_counts:
474
+ existing_cte_counts[cte.alias_or_name] += 10
475
+ cte.set(
476
+ "this",
477
+ cte.this.where(
478
+ exp.EQ(
479
+ this=exp.Literal.number(existing_cte_counts[cte.alias_or_name]),
480
+ expression=exp.Literal.number(
481
+ existing_cte_counts[cte.alias_or_name]
482
+ ),
483
+ )
484
+ ),
485
+ )
486
+ new_cte_alias = self._create_hash_from_expression(cte.this)
487
+ replaced_cte_names[cte.args["alias"].this] = maybe_parse(
488
+ new_cte_alias, dialect=self.session.input_dialect, into=exp.Identifier
489
+ )
490
+ cte.set(
491
+ "alias",
492
+ maybe_parse(
493
+ new_cte_alias, dialect=self.session.input_dialect, into=exp.TableAlias
494
+ ),
495
+ )
496
+ existing_ctes.append(cte)
473
497
  else:
474
498
  existing_ctes = ctes
475
499
  expression.set("with", exp.With(expressions=existing_ctes))
@@ -843,11 +867,11 @@ class _BaseDataFrame(t.Generic[SESSION, WRITER, NA, STAT, GROUP_DATA]):
843
867
  logger.warning("Got no value for on. This appears to change the join to a cross join.")
844
868
  how = "cross"
845
869
  other_df = other_df._convert_leaf_to_cte()
870
+ join_expression = self._add_ctes_to_expression(self.expression, other_df.expression.ctes)
846
871
  # We will determine actual "join on" expression later so we don't provide it at first
847
- join_expression = self.expression.join(
848
- other_df.latest_cte_name, join_type=how.replace("_", " ")
872
+ join_expression = join_expression.join(
873
+ join_expression.ctes[-1].alias, join_type=how.replace("_", " ")
849
874
  )
850
- join_expression = self._add_ctes_to_expression(join_expression, other_df.expression.ctes)
851
875
  self_columns = self._get_outer_select_columns(join_expression)
852
876
  other_columns = self._get_outer_select_columns(other_df.expression)
853
877
  join_columns = self._ensure_and_normalize_cols(on)
@@ -1320,8 +1320,8 @@ def flatten_using_array_flatten(col: ColumnOrName) -> Column:
1320
1320
  def map_concat_using_map_cat(*cols: t.Union[ColumnOrName, t.Iterable[ColumnOrName]]) -> Column:
1321
1321
  columns = list(flatten(cols)) if not isinstance(cols[0], (str, Column)) else cols # type: ignore
1322
1322
  if len(columns) == 1:
1323
- return Column.invoke_anonymous_function(columns[0], "MAP_CAT")
1324
- return Column.invoke_anonymous_function(columns[0], "MAP_CAT", *columns[1:])
1323
+ return Column.invoke_anonymous_function(columns[0], "MAP_CAT") # type: ignore
1324
+ return Column.invoke_anonymous_function(columns[0], "MAP_CAT", *columns[1:]) # type: ignore
1325
1325
 
1326
1326
 
1327
1327
  def sequence_from_generate_series(
@@ -1652,8 +1652,8 @@ def arrays_zip(*cols: ColumnOrName) -> Column:
1652
1652
  def map_concat(*cols: t.Union[ColumnOrName, t.Iterable[ColumnOrName]]) -> Column:
1653
1653
  columns = list(flatten(cols)) if not isinstance(cols[0], (str, Column)) else cols # type: ignore
1654
1654
  if len(columns) == 1:
1655
- return Column.invoke_anonymous_function(columns[0], "MAP_CONCAT")
1656
- return Column.invoke_anonymous_function(columns[0], "MAP_CONCAT", *columns[1:])
1655
+ return Column.invoke_anonymous_function(columns[0], "MAP_CONCAT") # type: ignore
1656
+ return Column.invoke_anonymous_function(columns[0], "MAP_CONCAT", *columns[1:]) # type: ignore
1657
1657
 
1658
1658
 
1659
1659
  @meta(unsupported_engines="postgres")
@@ -4697,7 +4697,7 @@ def spark_partition_id() -> Column:
4697
4697
  return Column.invoke_anonymous_function(None, "spark_partition_id")
4698
4698
 
4699
4699
 
4700
- @meta(unsupported_engines="*")
4700
+ @meta(unsupported_engines=["bigquery", "postgres"])
4701
4701
  def split_part(src: ColumnOrName, delimiter: ColumnOrName, partNum: ColumnOrName) -> Column:
4702
4702
  """
4703
4703
  Splits `str` by delimiter and return requested part of the split (1-based).
@@ -4723,7 +4723,9 @@ def split_part(src: ColumnOrName, delimiter: ColumnOrName, partNum: ColumnOrName
4723
4723
  >>> df.select(split_part(df.a, df.b, df.c).alias('r')).collect()
4724
4724
  [Row(r='13')]
4725
4725
  """
4726
- return Column.invoke_anonymous_function(src, "split_part", delimiter, partNum)
4726
+ return Column.invoke_expression_over_column(
4727
+ src, expression.SplitPart, delimiter=delimiter, part_index=partNum
4728
+ )
4727
4729
 
4728
4730
 
4729
4731
  @meta()
@@ -177,6 +177,7 @@ from sqlframe.base.functions import (
177
177
  skewness as skewness,
178
178
  sort_array as sort_array,
179
179
  soundex as soundex,
180
+ split_part as split_part,
180
181
  sqrt as sqrt,
181
182
  startswith as startswith,
182
183
  stddev as stddev,
@@ -187,6 +187,7 @@ from sqlframe.base.functions import (
187
187
  sinh as sinh,
188
188
  size as size,
189
189
  soundex as soundex,
190
+ split_part as split_part,
190
191
  sqrt as sqrt,
191
192
  startswith as startswith,
192
193
  stddev as stddev,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sqlframe
3
- Version: 3.4.0
3
+ Version: 3.5.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<3.11.1
2
- sqlglot<25.25,>=24.0.0
2
+ sqlglot<25.26,>=24.0.0
3
3
  typing_extensions<5,>=4.8
4
4
 
5
5
  [bigquery]
@@ -9,8 +9,8 @@ google-cloud-bigquery[pandas]<4,>=3
9
9
  [dev]
10
10
  duckdb<1.2,>=0.9
11
11
  findspark<3,>=2
12
- mypy<1.12,>=1.10.0
13
- openai<1.52,>=1.30
12
+ mypy<1.13,>=1.10.0
13
+ openai<1.53,>=1.30
14
14
  pandas-stubs<3,>=2
15
15
  pandas<3,>=2
16
16
  psycopg<4,>=3.1
@@ -19,7 +19,7 @@ pyspark<3.6,>=2
19
19
  pytest-postgresql<7,>=6
20
20
  pytest-xdist<3.7,>=3.6
21
21
  pytest<8.4,>=8.2.0
22
- ruff<0.7,>=0.4.4
22
+ ruff<0.8,>=0.4.4
23
23
  types-psycopg2<3,>=2.9
24
24
 
25
25
  [dev:python_version == "3.8"]
@@ -40,7 +40,7 @@ duckdb<1.2,>=0.9
40
40
  pandas<3,>=2
41
41
 
42
42
  [openai]
43
- openai<1.52,>=1.30
43
+ openai<1.53,>=1.30
44
44
 
45
45
  [pandas]
46
46
  pandas<3,>=2
@@ -5,6 +5,7 @@ import typing as t
5
5
  import pytest
6
6
 
7
7
  from sqlframe.base import types
8
+ from sqlframe.base.types import Row
8
9
  from sqlframe.bigquery import BigQuerySession
9
10
  from sqlframe.postgres import PostgresSession
10
11
 
@@ -14,6 +15,23 @@ if t.TYPE_CHECKING:
14
15
  pytest_plugins = ["tests.integration.fixtures"]
15
16
 
16
17
 
18
+ def test_columnt_eq_null_safe(get_session: t.Callable[[], _BaseSession], get_func):
19
+ session = get_session()
20
+ df1 = session.createDataFrame([Row(id=1, value="foo"), Row(id=2, value=None)])
21
+ lit = get_func("lit", session)
22
+ values = df1.select(
23
+ df1["value"] == "foo",
24
+ df1["value"].eqNullSafe("foo"),
25
+ df1["value"].eqNullSafe(None),
26
+ df1["id"].eqNullSafe(1),
27
+ df1["id"] == lit(None),
28
+ df1["id"].eqNullSafe(None),
29
+ ).collect()
30
+
31
+ assert values[0] == (True, True, False, True, None, False)
32
+ assert values[1] == (None, False, True, False, None, False)
33
+
34
+
17
35
  def test_column_get_item_array(get_session: t.Callable[[], _BaseSession], get_func):
18
36
  session = get_session()
19
37
  lit = get_func("lit", session)
@@ -231,6 +231,17 @@ def test_where_clause_single(
231
231
  compare_frames(df_employee, dfs_employee)
232
232
 
233
233
 
234
+ def test_where_clause_eq_nullsafe(
235
+ pyspark_employee: PySparkDataFrame,
236
+ get_df: t.Callable[[str], _BaseDataFrame],
237
+ compare_frames: t.Callable,
238
+ ):
239
+ employee = get_df("employee")
240
+ df_employee = pyspark_employee.where(F.col("age").eqNullSafe(F.lit(37)))
241
+ dfs_employee = employee.where(SF.col("age") == SF.lit(37))
242
+ compare_frames(df_employee, dfs_employee)
243
+
244
+
234
245
  def test_where_clause_multiple_and(
235
246
  pyspark_employee: PySparkDataFrame,
236
247
  get_df: t.Callable[[str], _BaseDataFrame],
@@ -2180,3 +2191,59 @@ def test_chained_join_common_key(
2180
2191
  dfs = dfs.join(dfs_height, how="left", on="name").join(dfs_location, how="left", on="name")
2181
2192
 
2182
2193
  compare_frames(df, dfs, compare_schema=False)
2194
+
2195
+
2196
+ # https://github.com/eakmanrq/sqlframe/issues/185
2197
+ def test_chaining_joins_with_selects(
2198
+ pyspark_employee: PySparkDataFrame,
2199
+ pyspark_store: PySparkDataFrame,
2200
+ pyspark_district: PySparkDataFrame,
2201
+ get_df: t.Callable[[str], _BaseDataFrame],
2202
+ compare_frames: t.Callable,
2203
+ is_spark: t.Callable,
2204
+ ):
2205
+ if is_spark():
2206
+ pytest.skip(
2207
+ "This test is not supported in Spark. This is related to how duplicate columns are handled in Spark"
2208
+ )
2209
+ df = (
2210
+ pyspark_employee.alias("employee")
2211
+ .join(
2212
+ pyspark_store.filter(F.col("store_name") != "test").alias("store"),
2213
+ on=F.col("employee.employee_id") == F.col("store.store_id"),
2214
+ )
2215
+ .join(
2216
+ pyspark_district.alias("district"),
2217
+ on=F.col("store.store_id") == F.col("district.district_id"),
2218
+ )
2219
+ .join(
2220
+ pyspark_district.alias("district2"),
2221
+ on=(F.col("store.store_id") + 1) == F.col("district2.district_id"),
2222
+ how="left",
2223
+ )
2224
+ .select("*")
2225
+ )
2226
+
2227
+ employee = get_df("employee")
2228
+ store = get_df("store")
2229
+ district = get_df("district")
2230
+
2231
+ dfs = (
2232
+ employee.alias("employee")
2233
+ .join(
2234
+ store.filter(SF.col("store_name") != "test").alias("store"),
2235
+ on=SF.col("employee.employee_id") == SF.col("store.store_id"),
2236
+ )
2237
+ .join(
2238
+ district.alias("district"),
2239
+ on=SF.col("store.store_id") == SF.col("district.district_id"),
2240
+ )
2241
+ .join(
2242
+ district.alias("district2"),
2243
+ on=(SF.col("store.store_id") + 1) == SF.col("district2.district_id"),
2244
+ how="left",
2245
+ )
2246
+ .select("*")
2247
+ )
2248
+
2249
+ compare_frames(df, dfs, compare_schema=False)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes