sqlframe 3.3.1__tar.gz → 3.4.1__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.3.1 → sqlframe-3.4.1}/PKG-INFO +1 -1
  2. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/bigquery.md +0 -1
  3. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/duckdb.md +0 -1
  4. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/snowflake.md +0 -1
  5. {sqlframe-3.3.1 → sqlframe-3.4.1}/setup.py +4 -4
  6. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/_version.py +2 -2
  7. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/dataframe.py +33 -9
  8. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/functions.py +11 -10
  9. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/bigquery/functions.pyi +1 -0
  10. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/duckdb/functions.pyi +1 -0
  11. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/duckdb/session.py +4 -0
  12. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/snowflake/functions.pyi +1 -0
  13. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/spark/functions.py +1 -0
  14. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/spark/functions.pyi +1 -1
  15. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe.egg-info/PKG-INFO +1 -1
  16. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe.egg-info/requires.txt +4 -4
  17. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/common_fixtures.py +5 -2
  18. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/duck/test_duckdb_catalog.py +4 -1
  19. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/test_int_functions.py +1 -1
  20. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/test_int_dataframe.py +56 -0
  21. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/standalone/test_functions.py +8 -8
  22. {sqlframe-3.3.1 → sqlframe-3.4.1}/.github/CODEOWNERS +0 -0
  23. {sqlframe-3.3.1 → sqlframe-3.4.1}/.github/workflows/main.workflow.yaml +0 -0
  24. {sqlframe-3.3.1 → sqlframe-3.4.1}/.github/workflows/publish.workflow.yaml +0 -0
  25. {sqlframe-3.3.1 → sqlframe-3.4.1}/.gitignore +0 -0
  26. {sqlframe-3.3.1 → sqlframe-3.4.1}/.pre-commit-config.yaml +0 -0
  27. {sqlframe-3.3.1 → sqlframe-3.4.1}/.readthedocs.yaml +0 -0
  28. {sqlframe-3.3.1 → sqlframe-3.4.1}/LICENSE +0 -0
  29. {sqlframe-3.3.1 → sqlframe-3.4.1}/Makefile +0 -0
  30. {sqlframe-3.3.1 → sqlframe-3.4.1}/README.md +0 -0
  31. {sqlframe-3.3.1 → sqlframe-3.4.1}/blogs/add_chatgpt_support.md +0 -0
  32. {sqlframe-3.3.1 → sqlframe-3.4.1}/blogs/images/add_chatgpt_support/adding_ai_to_meal.jpeg +0 -0
  33. {sqlframe-3.3.1 → sqlframe-3.4.1}/blogs/images/add_chatgpt_support/hype_train.gif +0 -0
  34. {sqlframe-3.3.1 → sqlframe-3.4.1}/blogs/images/add_chatgpt_support/marvin_paranoid_robot.gif +0 -0
  35. {sqlframe-3.3.1 → sqlframe-3.4.1}/blogs/images/add_chatgpt_support/nonsense_sql.png +0 -0
  36. {sqlframe-3.3.1 → sqlframe-3.4.1}/blogs/images/add_chatgpt_support/openai_full_rewrite.png +0 -0
  37. {sqlframe-3.3.1 → sqlframe-3.4.1}/blogs/images/add_chatgpt_support/openai_replacing_cte_names.png +0 -0
  38. {sqlframe-3.3.1 → sqlframe-3.4.1}/blogs/images/add_chatgpt_support/sqlglot_optimized_code.png +0 -0
  39. {sqlframe-3.3.1 → sqlframe-3.4.1}/blogs/images/add_chatgpt_support/sunny_shake_head_no.gif +0 -0
  40. {sqlframe-3.3.1 → sqlframe-3.4.1}/blogs/images/but_wait_theres_more.gif +0 -0
  41. {sqlframe-3.3.1 → sqlframe-3.4.1}/blogs/images/cake.gif +0 -0
  42. {sqlframe-3.3.1 → sqlframe-3.4.1}/blogs/images/you_get_pyspark_api.gif +0 -0
  43. {sqlframe-3.3.1 → sqlframe-3.4.1}/blogs/sqlframe_universal_dataframe_api.md +0 -0
  44. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/configuration.md +0 -0
  45. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/docs/bigquery.md +0 -0
  46. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/docs/duckdb.md +0 -0
  47. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/docs/images/SF.png +0 -0
  48. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/docs/images/favicon.png +0 -0
  49. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/docs/images/favicon_old.png +0 -0
  50. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/docs/images/sqlframe_diagram.png +0 -0
  51. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/docs/images/sqlframe_logo.png +0 -0
  52. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/docs/postgres.md +0 -0
  53. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/images/SF.png +0 -0
  54. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/images/favicon.png +0 -0
  55. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/images/favicon_old.png +0 -0
  56. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/images/sqlframe_diagram.png +0 -0
  57. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/images/sqlframe_logo.png +0 -0
  58. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/index.md +0 -0
  59. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/postgres.md +0 -0
  60. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/requirements.txt +0 -0
  61. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/spark.md +0 -0
  62. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/standalone.md +0 -0
  63. {sqlframe-3.3.1 → sqlframe-3.4.1}/docs/stylesheets/extra.css +0 -0
  64. {sqlframe-3.3.1 → sqlframe-3.4.1}/mkdocs.yml +0 -0
  65. {sqlframe-3.3.1 → sqlframe-3.4.1}/pytest.ini +0 -0
  66. {sqlframe-3.3.1 → sqlframe-3.4.1}/renovate.json +0 -0
  67. {sqlframe-3.3.1 → sqlframe-3.4.1}/setup.cfg +0 -0
  68. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/LICENSE +0 -0
  69. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/__init__.py +0 -0
  70. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/__init__.py +0 -0
  71. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/_typing.py +0 -0
  72. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/catalog.py +0 -0
  73. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/column.py +0 -0
  74. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/decorators.py +0 -0
  75. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/exceptions.py +0 -0
  76. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/function_alternatives.py +0 -0
  77. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/group.py +0 -0
  78. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/mixins/__init__.py +0 -0
  79. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/mixins/catalog_mixins.py +0 -0
  80. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/mixins/dataframe_mixins.py +0 -0
  81. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/mixins/readwriter_mixins.py +0 -0
  82. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/normalize.py +0 -0
  83. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/operations.py +0 -0
  84. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/readerwriter.py +0 -0
  85. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/session.py +0 -0
  86. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/transforms.py +0 -0
  87. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/types.py +0 -0
  88. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/udf.py +0 -0
  89. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/util.py +0 -0
  90. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/base/window.py +0 -0
  91. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/bigquery/__init__.py +0 -0
  92. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/bigquery/catalog.py +0 -0
  93. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/bigquery/column.py +0 -0
  94. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/bigquery/dataframe.py +0 -0
  95. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/bigquery/functions.py +0 -0
  96. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/bigquery/group.py +0 -0
  97. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/bigquery/readwriter.py +0 -0
  98. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/bigquery/session.py +0 -0
  99. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/bigquery/types.py +0 -0
  100. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/bigquery/udf.py +0 -0
  101. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/bigquery/window.py +0 -0
  102. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/duckdb/__init__.py +0 -0
  103. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/duckdb/catalog.py +0 -0
  104. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/duckdb/column.py +0 -0
  105. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/duckdb/dataframe.py +0 -0
  106. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/duckdb/functions.py +0 -0
  107. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/duckdb/group.py +0 -0
  108. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/duckdb/readwriter.py +0 -0
  109. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/duckdb/types.py +0 -0
  110. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/duckdb/udf.py +0 -0
  111. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/duckdb/window.py +0 -0
  112. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/postgres/__init__.py +0 -0
  113. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/postgres/catalog.py +0 -0
  114. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/postgres/column.py +0 -0
  115. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/postgres/dataframe.py +0 -0
  116. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/postgres/functions.py +0 -0
  117. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/postgres/functions.pyi +0 -0
  118. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/postgres/group.py +0 -0
  119. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/postgres/readwriter.py +0 -0
  120. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/postgres/session.py +0 -0
  121. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/postgres/types.py +0 -0
  122. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/postgres/udf.py +0 -0
  123. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/postgres/window.py +0 -0
  124. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/redshift/__init__.py +0 -0
  125. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/redshift/catalog.py +0 -0
  126. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/redshift/column.py +0 -0
  127. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/redshift/dataframe.py +0 -0
  128. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/redshift/functions.py +0 -0
  129. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/redshift/group.py +0 -0
  130. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/redshift/readwriter.py +0 -0
  131. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/redshift/session.py +0 -0
  132. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/redshift/types.py +0 -0
  133. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/redshift/udf.py +0 -0
  134. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/redshift/window.py +0 -0
  135. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/snowflake/__init__.py +0 -0
  136. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/snowflake/catalog.py +0 -0
  137. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/snowflake/column.py +0 -0
  138. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/snowflake/dataframe.py +0 -0
  139. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/snowflake/functions.py +0 -0
  140. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/snowflake/group.py +0 -0
  141. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/snowflake/readwriter.py +0 -0
  142. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/snowflake/session.py +0 -0
  143. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/snowflake/types.py +0 -0
  144. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/snowflake/udf.py +0 -0
  145. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/snowflake/window.py +0 -0
  146. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/spark/__init__.py +0 -0
  147. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/spark/catalog.py +0 -0
  148. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/spark/column.py +0 -0
  149. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/spark/dataframe.py +0 -0
  150. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/spark/group.py +0 -0
  151. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/spark/readwriter.py +0 -0
  152. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/spark/session.py +0 -0
  153. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/spark/types.py +0 -0
  154. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/spark/udf.py +0 -0
  155. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/spark/window.py +0 -0
  156. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/standalone/__init__.py +0 -0
  157. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/standalone/catalog.py +0 -0
  158. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/standalone/column.py +0 -0
  159. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/standalone/dataframe.py +0 -0
  160. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/standalone/functions.py +0 -0
  161. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/standalone/group.py +0 -0
  162. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/standalone/readwriter.py +0 -0
  163. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/standalone/session.py +0 -0
  164. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/standalone/types.py +0 -0
  165. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/standalone/udf.py +0 -0
  166. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/standalone/window.py +0 -0
  167. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/testing/__init__.py +0 -0
  168. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe/testing/utils.py +0 -0
  169. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe.egg-info/SOURCES.txt +0 -0
  170. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe.egg-info/dependency_links.txt +0 -0
  171. {sqlframe-3.3.1 → sqlframe-3.4.1}/sqlframe.egg-info/top_level.txt +0 -0
  172. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/__init__.py +0 -0
  173. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/conftest.py +0 -0
  174. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee.csv +0 -0
  175. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee.json +0 -0
  176. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee.parquet +0 -0
  177. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee_delta/.part-00000-e5965c7b-e58f-4d3c-ad56-002876814e3a-c000.snappy.parquet.crc +0 -0
  178. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee_delta/.part-00002-3fed7f18-370f-4b16-b232-504d6194eb52-c000.snappy.parquet.crc +0 -0
  179. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee_delta/.part-00004-143c5da1-d5ab-4706-8e84-0d2a324c6894-c000.snappy.parquet.crc +0 -0
  180. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee_delta/.part-00006-64f07e25-c30e-4075-acc6-b3c69c4ce80b-c000.snappy.parquet.crc +0 -0
  181. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee_delta/.part-00008-89ccad8d-df73-4ad5-8850-82ef3884db60-c000.snappy.parquet.crc +0 -0
  182. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee_delta/.part-00010-812b3382-8c7f-4c4e-9bcd-09ce8664f6e0-c000.snappy.parquet.crc +0 -0
  183. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee_delta/_delta_log/.00000000000000000000.json.crc +0 -0
  184. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee_delta/_delta_log/00000000000000000000.json +0 -0
  185. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee_delta/part-00000-e5965c7b-e58f-4d3c-ad56-002876814e3a-c000.snappy.parquet +0 -0
  186. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee_delta/part-00002-3fed7f18-370f-4b16-b232-504d6194eb52-c000.snappy.parquet +0 -0
  187. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee_delta/part-00004-143c5da1-d5ab-4706-8e84-0d2a324c6894-c000.snappy.parquet +0 -0
  188. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee_delta/part-00006-64f07e25-c30e-4075-acc6-b3c69c4ce80b-c000.snappy.parquet +0 -0
  189. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee_delta/part-00008-89ccad8d-df73-4ad5-8850-82ef3884db60-c000.snappy.parquet +0 -0
  190. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee_delta/part-00010-812b3382-8c7f-4c4e-9bcd-09ce8664f6e0-c000.snappy.parquet +0 -0
  191. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/employee_extra_line.csv +0 -0
  192. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds1.sql +0 -0
  193. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds10.sql +0 -0
  194. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds11.sql +0 -0
  195. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds12.sql +0 -0
  196. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds13.sql +0 -0
  197. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds14.sql +0 -0
  198. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds15.sql +0 -0
  199. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds16.sql +0 -0
  200. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds17.sql +0 -0
  201. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds18.sql +0 -0
  202. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds19.sql +0 -0
  203. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds2.sql +0 -0
  204. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds20.sql +0 -0
  205. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds21.sql +0 -0
  206. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds22.sql +0 -0
  207. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds23.sql +0 -0
  208. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds24.sql +0 -0
  209. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds25.sql +0 -0
  210. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds26.sql +0 -0
  211. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds27.sql +0 -0
  212. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds28.sql +0 -0
  213. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds29.sql +0 -0
  214. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds3.sql +0 -0
  215. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds30.sql +0 -0
  216. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds31.sql +0 -0
  217. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds32.sql +0 -0
  218. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds33.sql +0 -0
  219. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds34.sql +0 -0
  220. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds35.sql +0 -0
  221. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds36.sql +0 -0
  222. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds37.sql +0 -0
  223. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds38.sql +0 -0
  224. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds39.sql +0 -0
  225. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds4.sql +0 -0
  226. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds40.sql +0 -0
  227. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds41.sql +0 -0
  228. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds42.sql +0 -0
  229. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds43.sql +0 -0
  230. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds44.sql +0 -0
  231. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds45.sql +0 -0
  232. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds46.sql +0 -0
  233. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds47.sql +0 -0
  234. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds48.sql +0 -0
  235. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds49.sql +0 -0
  236. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds5.sql +0 -0
  237. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds50.sql +0 -0
  238. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds51.sql +0 -0
  239. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds52.sql +0 -0
  240. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds53.sql +0 -0
  241. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds54.sql +0 -0
  242. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds55.sql +0 -0
  243. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds56.sql +0 -0
  244. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds57.sql +0 -0
  245. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds58.sql +0 -0
  246. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds59.sql +0 -0
  247. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds6.sql +0 -0
  248. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds60.sql +0 -0
  249. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds61.sql +0 -0
  250. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds62.sql +0 -0
  251. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds63.sql +0 -0
  252. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds64.sql +0 -0
  253. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds65.sql +0 -0
  254. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds66.sql +0 -0
  255. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds67.sql +0 -0
  256. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds68.sql +0 -0
  257. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds69.sql +0 -0
  258. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds7.sql +0 -0
  259. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds70.sql +0 -0
  260. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds71.sql +0 -0
  261. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds72.sql +0 -0
  262. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds73.sql +0 -0
  263. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds74.sql +0 -0
  264. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds75.sql +0 -0
  265. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds76.sql +0 -0
  266. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds77.sql +0 -0
  267. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds78.sql +0 -0
  268. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds79.sql +0 -0
  269. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds8.sql +0 -0
  270. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds80.sql +0 -0
  271. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds81.sql +0 -0
  272. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds82.sql +0 -0
  273. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds83.sql +0 -0
  274. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds84.sql +0 -0
  275. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds85.sql +0 -0
  276. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds86.sql +0 -0
  277. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds87.sql +0 -0
  278. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds88.sql +0 -0
  279. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds89.sql +0 -0
  280. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds9.sql +0 -0
  281. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds90.sql +0 -0
  282. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds91.sql +0 -0
  283. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds92.sql +0 -0
  284. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds93.sql +0 -0
  285. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds94.sql +0 -0
  286. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds95.sql +0 -0
  287. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds96.sql +0 -0
  288. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds97.sql +0 -0
  289. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds98.sql +0 -0
  290. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/fixtures/tpcds/tpcds99.sql +0 -0
  291. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/__init__.py +0 -0
  292. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/__init__.py +0 -0
  293. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/bigquery/__init__.py +0 -0
  294. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/bigquery/test_bigquery_catalog.py +0 -0
  295. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/bigquery/test_bigquery_dataframe.py +0 -0
  296. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/bigquery/test_bigquery_session.py +0 -0
  297. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/duck/__init__.py +0 -0
  298. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/duck/test_duckdb_activate.py +0 -0
  299. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/duck/test_duckdb_dataframe.py +0 -0
  300. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/duck/test_duckdb_reader.py +0 -0
  301. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/duck/test_duckdb_session.py +0 -0
  302. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/duck/test_duckdb_udf.py +0 -0
  303. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/duck/test_tpcds.py +0 -0
  304. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/postgres/__init__.py +0 -0
  305. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/postgres/test_postgres_activate.py +0 -0
  306. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/postgres/test_postgres_catalog.py +0 -0
  307. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/postgres/test_postgres_dataframe.py +0 -0
  308. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/postgres/test_postgres_session.py +0 -0
  309. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/redshift/__init__.py +0 -0
  310. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/redshift/test_redshift_catalog.py +0 -0
  311. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/redshift/test_redshift_session.py +0 -0
  312. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/snowflake/__init__.py +0 -0
  313. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/snowflake/test_snowflake_catalog.py +0 -0
  314. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/snowflake/test_snowflake_dataframe.py +0 -0
  315. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/snowflake/test_snowflake_session.py +0 -0
  316. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/spark/__init__.py +0 -0
  317. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/spark/test_spark_catalog.py +0 -0
  318. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/spark/test_spark_dataframe.py +0 -0
  319. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/test_engine_column.py +0 -0
  320. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/test_engine_dataframe.py +0 -0
  321. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/test_engine_reader.py +0 -0
  322. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/test_engine_session.py +0 -0
  323. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/test_engine_writer.py +0 -0
  324. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/engines/test_int_testing.py +0 -0
  325. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/fixtures.py +0 -0
  326. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/test_int_dataframe_stats.py +0 -0
  327. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/test_int_grouped_data.py +0 -0
  328. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/integration/test_int_session.py +0 -0
  329. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/types.py +0 -0
  330. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/__init__.py +0 -0
  331. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/bigquery/__init__.py +0 -0
  332. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/bigquery/test_activate.py +0 -0
  333. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/conftest.py +0 -0
  334. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/duck/__init__.py +0 -0
  335. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/duck/test_activate.py +0 -0
  336. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/postgres/__init__.py +0 -0
  337. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/postgres/test_activate.py +0 -0
  338. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/redshift/__init__.py +0 -0
  339. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/redshift/test_activate.py +0 -0
  340. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/snowflake/__init__.py +0 -0
  341. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/snowflake/test_activate.py +0 -0
  342. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/spark/__init__.py +0 -0
  343. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/spark/test_activate.py +0 -0
  344. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/standalone/__init__.py +0 -0
  345. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/standalone/fixtures.py +0 -0
  346. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/standalone/test_activate.py +0 -0
  347. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/standalone/test_column.py +0 -0
  348. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/standalone/test_dataframe.py +0 -0
  349. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/standalone/test_dataframe_writer.py +0 -0
  350. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/standalone/test_session.py +0 -0
  351. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/standalone/test_session_case_sensitivity.py +0 -0
  352. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/standalone/test_types.py +0 -0
  353. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/standalone/test_window.py +0 -0
  354. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/test_activate.py +0 -0
  355. {sqlframe-3.3.1 → sqlframe-3.4.1}/tests/unit/test_util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sqlframe
3
- Version: 3.3.1
3
+ Version: 3.4.1
4
4
  Summary: Turning PySpark Into a Universal DataFrame API
5
5
  Home-page: https://github.com/eakmanrq/sqlframe
6
6
  Author: Ryan Eakman
@@ -234,7 +234,6 @@ See something that you would like to see supported? [Open an issue](https://gith
234
234
  * sql
235
235
  * SQLFrame Specific: Get the SQL representation of a given column
236
236
  * [startswith](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.Column.startswith.html)
237
- * [substr](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.Column.substr.html)
238
237
  * [when](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.Column.when.html)
239
238
 
240
239
  ### DataFrame Class
@@ -198,7 +198,6 @@ See something that you would like to see supported? [Open an issue](https://gith
198
198
  * sql
199
199
  * SQLFrame Specific: Get the SQL representation of a given column
200
200
  * [startswith](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.Column.startswith.html)
201
- * [substr](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.Column.substr.html)
202
201
  * [when](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.Column.when.html)
203
202
 
204
203
  ### DataFrame Class
@@ -230,7 +230,6 @@ See something that you would like to see supported? [Open an issue](https://gith
230
230
  * sql
231
231
  * SQLFrame Specific: Get the SQL representation of a given column
232
232
  * [startswith](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.Column.startswith.html)
233
- * [substr](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.Column.substr.html)
234
233
  * [when](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.Column.when.html)
235
234
 
236
235
  ### DataFrame Class
@@ -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.23",
23
+ "sqlglot>=24.0.0,<25.25",
24
24
  "typing_extensions>=4.8,<5",
25
25
  ],
26
26
  extras_require={
@@ -32,7 +32,7 @@ setup(
32
32
  "duckdb>=0.9,<1.2",
33
33
  "findspark>=2,<3",
34
34
  "mypy>=1.10.0,<1.12",
35
- "openai>=1.30,<1.48",
35
+ "openai>=1.30,<1.52",
36
36
  "pandas>=2,<3",
37
37
  "pandas-stubs>=2,<3",
38
38
  "psycopg>=3.1,<4",
@@ -42,7 +42,7 @@ setup(
42
42
  "pytest-postgresql>=6,<7",
43
43
  "pytest-xdist>=3.6,<3.7",
44
44
  "pre-commit>=3.5;python_version=='3.8'",
45
- "pre-commit>=3.7,<3.9;python_version>='3.9'",
45
+ "pre-commit>=3.7,<4.1;python_version>='3.9'",
46
46
  "ruff>=0.4.4,<0.7",
47
47
  "types-psycopg2>=2.9,<3",
48
48
  ],
@@ -58,7 +58,7 @@ setup(
58
58
  "pandas>=2,<3",
59
59
  ],
60
60
  "openai": [
61
- "openai>=1.30,<1.48",
61
+ "openai>=1.30,<1.52",
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.3.1'
16
- __version_tuple__ = version_tuple = (3, 3, 1)
15
+ __version__ = version = '3.4.1'
16
+ __version_tuple__ = version_tuple = (3, 4, 1)
@@ -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)
@@ -1129,11 +1129,15 @@ def overlay(
1129
1129
  pos: t.Union[ColumnOrName, int],
1130
1130
  len: t.Optional[t.Union[ColumnOrName, int]] = None,
1131
1131
  ) -> Column:
1132
- pos_value = lit(pos) if isinstance(pos, int) else pos
1133
- if len is not None:
1134
- len_value = lit(len) if isinstance(len, int) else len
1135
- return Column.invoke_anonymous_function(src, "OVERLAY", replace, pos_value, len_value)
1136
- return Column.invoke_anonymous_function(src, "OVERLAY", replace, pos_value)
1132
+ return Column.invoke_expression_over_column(
1133
+ src,
1134
+ expression.Overlay,
1135
+ **{
1136
+ "expression": Column(replace).expression,
1137
+ "from": lit(pos).expression,
1138
+ "for": lit(len).expression if len is not None else None,
1139
+ },
1140
+ )
1137
1141
 
1138
1142
 
1139
1143
  @meta(unsupported_engines=["bigquery", "duckdb", "postgres", "snowflake"])
@@ -4834,7 +4838,7 @@ def str_to_map(
4834
4838
  )
4835
4839
 
4836
4840
 
4837
- @meta(unsupported_engines="*")
4841
+ @meta(unsupported_engines="postgres")
4838
4842
  def substr(str: ColumnOrName, pos: ColumnOrName, len: t.Optional[ColumnOrName] = None) -> Column:
4839
4843
  """
4840
4844
  Returns the substring of `str` that starts at `pos` and is of length `len`,
@@ -4873,10 +4877,7 @@ def substr(str: ColumnOrName, pos: ColumnOrName, len: t.Optional[ColumnOrName] =
4873
4877
  | k SQL|
4874
4878
  +------------------------+
4875
4879
  """
4876
- if len is not None:
4877
- return Column.invoke_anonymous_function(str, "substr", pos, len)
4878
- else:
4879
- return Column.invoke_anonymous_function(str, "substr", pos)
4880
+ return Column.invoke_expression_over_column(str, expression.Substring, start=pos, length=len)
4880
4881
 
4881
4882
 
4882
4883
  @meta(unsupported_engines="*")
@@ -251,6 +251,7 @@ from sqlframe.base.functions import stddev as stddev
251
251
  from sqlframe.base.functions import stddev_pop as stddev_pop
252
252
  from sqlframe.base.functions import stddev_samp as stddev_samp
253
253
  from sqlframe.base.functions import struct as struct
254
+ from sqlframe.base.functions import substr as substr
254
255
  from sqlframe.base.functions import substring as substring
255
256
  from sqlframe.base.functions import sum as sum
256
257
  from sqlframe.base.functions import sum_distinct as sum_distinct
@@ -184,6 +184,7 @@ from sqlframe.base.functions import (
184
184
  stddev_samp as stddev_samp,
185
185
  struct as struct,
186
186
  substring as substring,
187
+ substr as substr,
187
188
  sum as sum,
188
189
  sumDistinct as sumDistinct,
189
190
  sum_distinct as sum_distinct,
@@ -52,6 +52,10 @@ class DuckDBSession(
52
52
  super().__init__(conn, *args, **kwargs)
53
53
  self._last_result = None
54
54
 
55
+ @cached_property
56
+ def _cur(self) -> DuckDBPyConnection: # type: ignore
57
+ return self._conn
58
+
55
59
  @classmethod
56
60
  def _try_get_map(cls, value: t.Any) -> t.Optional[t.Dict[str, t.Any]]:
57
61
  if value and isinstance(value, dict):
@@ -193,6 +193,7 @@ from sqlframe.base.functions import (
193
193
  stddev_pop as stddev_pop,
194
194
  stddev_samp as stddev_samp,
195
195
  substring as substring,
196
+ substr as substr,
196
197
  sum as sum,
197
198
  sumDistinct as sumDistinct,
198
199
  sum_distinct as sum_distinct,
@@ -18,4 +18,5 @@ from sqlframe.base.function_alternatives import ( # noqa
18
18
  add_months_by_multiplication as add_months,
19
19
  arrays_overlap_renamed as arrays_overlap,
20
20
  _is_string_using_typeof_string_lcase as _is_string,
21
+ try_element_at_zero_based as try_element_at,
21
22
  )
@@ -2,6 +2,7 @@ from sqlframe.base.function_alternatives import ( # noqa
2
2
  percentile_without_disc as percentile,
3
3
  add_months_by_multiplication as add_months,
4
4
  arrays_overlap_renamed as arrays_overlap,
5
+ try_element_at_zero_based as try_element_at,
5
6
  )
6
7
  from sqlframe.base.functions import (
7
8
  abs as abs,
@@ -372,7 +373,6 @@ from sqlframe.base.functions import (
372
373
  try_aes_decrypt as try_aes_decrypt,
373
374
  try_avg as try_avg,
374
375
  try_divide as try_divide,
375
- try_element_at as try_element_at,
376
376
  try_multiply as try_multiply,
377
377
  try_subtract as try_subtract,
378
378
  try_sum as try_sum,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sqlframe
3
- Version: 3.3.1
3
+ Version: 3.4.1
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.23,>=24.0.0
2
+ sqlglot<25.25,>=24.0.0
3
3
  typing_extensions<5,>=4.8
4
4
 
5
5
  [bigquery]
@@ -10,7 +10,7 @@ google-cloud-bigquery[pandas]<4,>=3
10
10
  duckdb<1.2,>=0.9
11
11
  findspark<3,>=2
12
12
  mypy<1.12,>=1.10.0
13
- openai<1.48,>=1.30
13
+ openai<1.52,>=1.30
14
14
  pandas-stubs<3,>=2
15
15
  pandas<3,>=2
16
16
  psycopg<4,>=3.1
@@ -26,7 +26,7 @@ types-psycopg2<3,>=2.9
26
26
  pre-commit>=3.5
27
27
 
28
28
  [dev:python_version >= "3.9"]
29
- pre-commit<3.9,>=3.7
29
+ pre-commit<4.1,>=3.7
30
30
 
31
31
  [docs]
32
32
  mkdocs-include-markdown-plugin==6.0.6
@@ -40,7 +40,7 @@ duckdb<1.2,>=0.9
40
40
  pandas<3,>=2
41
41
 
42
42
  [openai]
43
- openai<1.48,>=1.30
43
+ openai<1.52,>=1.30
44
44
 
45
45
  [pandas]
46
46
  pandas<3,>=2
@@ -117,8 +117,11 @@ def spark_session(pyspark_session: PySparkSession) -> SparkSession:
117
117
 
118
118
  @pytest.fixture(scope="function")
119
119
  def duckdb_session() -> DuckDBSession:
120
- connection = duckdb.connect(config={"TimeZone": "UTC"})
121
- return DuckDBSession(conn=connection)
120
+ connector = duckdb.connect()
121
+ connector.execute("set TimeZone = 'UTC'")
122
+ connector.execute("SELECT * FROM duckdb_settings() WHERE name = 'TimeZone'")
123
+ assert connector.fetchone()[1] == "UTC" # type: ignore
124
+ return DuckDBSession(conn=connector)
122
125
 
123
126
 
124
127
  @pytest.fixture
@@ -8,7 +8,10 @@ from sqlframe.duckdb.session import DuckDBSession
8
8
  def duckdb_session() -> DuckDBSession:
9
9
  import duckdb
10
10
 
11
- connector = duckdb.connect(config={"TimeZone": "UTC"})
11
+ connector = duckdb.connect()
12
+ connector.execute("set TimeZone = 'UTC'")
13
+ connector.execute("SELECT * FROM duckdb_settings() WHERE name = 'TimeZone'")
14
+ assert connector.fetchone()[1] == "UTC" # type: ignore
12
15
  session = DuckDBSession(connector)
13
16
  session._execute('''ATTACH ':memory:' AS "default"''')
14
17
  session._execute('''ATTACH ':memory:' AS "catalog1"''')
@@ -18,7 +18,7 @@ from sqlframe.base.util import (
18
18
  get_func_from_session as get_func_from_session_without_fallback,
19
19
  )
20
20
  from sqlframe.bigquery import BigQuerySession
21
- from sqlframe.duckdb import DuckDBSession
21
+ from sqlframe.duckdb import DuckDBCatalog, DuckDBSession
22
22
  from sqlframe.postgres import PostgresDataFrame, PostgresSession
23
23
  from sqlframe.snowflake import SnowflakeSession
24
24
  from sqlframe.spark.session import SparkSession
@@ -2180,3 +2180,59 @@ def test_chained_join_common_key(
2180
2180
  dfs = dfs.join(dfs_height, how="left", on="name").join(dfs_location, how="left", on="name")
2181
2181
 
2182
2182
  compare_frames(df, dfs, compare_schema=False)
2183
+
2184
+
2185
+ # https://github.com/eakmanrq/sqlframe/issues/185
2186
+ def test_chaining_joins_with_selects(
2187
+ pyspark_employee: PySparkDataFrame,
2188
+ pyspark_store: PySparkDataFrame,
2189
+ pyspark_district: PySparkDataFrame,
2190
+ get_df: t.Callable[[str], _BaseDataFrame],
2191
+ compare_frames: t.Callable,
2192
+ is_spark: t.Callable,
2193
+ ):
2194
+ if is_spark():
2195
+ pytest.skip(
2196
+ "This test is not supported in Spark. This is related to how duplicate columns are handled in Spark"
2197
+ )
2198
+ df = (
2199
+ pyspark_employee.alias("employee")
2200
+ .join(
2201
+ pyspark_store.filter(F.col("store_name") != "test").alias("store"),
2202
+ on=F.col("employee.employee_id") == F.col("store.store_id"),
2203
+ )
2204
+ .join(
2205
+ pyspark_district.alias("district"),
2206
+ on=F.col("store.store_id") == F.col("district.district_id"),
2207
+ )
2208
+ .join(
2209
+ pyspark_district.alias("district2"),
2210
+ on=(F.col("store.store_id") + 1) == F.col("district2.district_id"),
2211
+ how="left",
2212
+ )
2213
+ .select("*")
2214
+ )
2215
+
2216
+ employee = get_df("employee")
2217
+ store = get_df("store")
2218
+ district = get_df("district")
2219
+
2220
+ dfs = (
2221
+ employee.alias("employee")
2222
+ .join(
2223
+ store.filter(SF.col("store_name") != "test").alias("store"),
2224
+ on=SF.col("employee.employee_id") == SF.col("store.store_id"),
2225
+ )
2226
+ .join(
2227
+ district.alias("district"),
2228
+ on=SF.col("store.store_id") == SF.col("district.district_id"),
2229
+ )
2230
+ .join(
2231
+ district.alias("district2"),
2232
+ on=(SF.col("store.store_id") + 1) == SF.col("district2.district_id"),
2233
+ how="left",
2234
+ )
2235
+ .select("*")
2236
+ )
2237
+
2238
+ compare_frames(df, dfs, compare_schema=False)
@@ -1823,12 +1823,12 @@ def test_instr(expression, expected):
1823
1823
  @pytest.mark.parametrize(
1824
1824
  "expression, expected",
1825
1825
  [
1826
- (SF.overlay("cola", "colb", 3, 7), "OVERLAY(cola, colb, 3, 7)"),
1826
+ (SF.overlay("cola", "colb", 3, 7), "OVERLAY(cola PLACING colb FROM 3 FOR 7)"),
1827
1827
  (
1828
1828
  SF.overlay(SF.col("cola"), SF.col("colb"), SF.lit(3), SF.lit(7)),
1829
- "OVERLAY(cola, colb, 3, 7)",
1829
+ "OVERLAY(cola PLACING colb FROM 3 FOR 7)",
1830
1830
  ),
1831
- (SF.overlay("cola", "colb", 3), "OVERLAY(cola, colb, 3)"),
1831
+ (SF.overlay("cola", "colb", 3), "OVERLAY(cola PLACING colb FROM 3)"),
1832
1832
  ],
1833
1833
  )
1834
1834
  def test_overlay(expression, expected):
@@ -2263,8 +2263,8 @@ def test_array_contains(expression, expected):
2263
2263
  @pytest.mark.parametrize(
2264
2264
  "expression, expected",
2265
2265
  [
2266
- (SF.arrays_overlap("cola", "colb"), "ARRAY_OVERLAPS(cola, colb)"),
2267
- (SF.arrays_overlap(SF.col("cola"), SF.col("colb")), "ARRAY_OVERLAPS(cola, colb)"),
2266
+ (SF.arrays_overlap("cola", "colb"), "cola && colb"),
2267
+ (SF.arrays_overlap(SF.col("cola"), SF.col("colb")), "cola && colb"),
2268
2268
  ],
2269
2269
  )
2270
2270
  def test_arrays_overlap(expression, expected):
@@ -4495,9 +4495,9 @@ def test_str_to_map(expression, expected):
4495
4495
  @pytest.mark.parametrize(
4496
4496
  "expression, expected",
4497
4497
  [
4498
- (SF.substr("cola", "colb"), "SUBSTR(cola, colb)"),
4499
- (SF.substr(SF.col("cola"), SF.col("colb")), "SUBSTR(cola, colb)"),
4500
- (SF.substr("cola", "colb", "colc"), "SUBSTR(cola, colb, colc)"),
4498
+ (SF.substr("cola", "colb"), "SUBSTRING(cola, colb)"),
4499
+ (SF.substr(SF.col("cola"), SF.col("colb")), "SUBSTRING(cola, colb)"),
4500
+ (SF.substr("cola", "colb", "colc"), "SUBSTRING(cola, colb, colc)"),
4501
4501
  ],
4502
4502
  )
4503
4503
  def test_substr(expression, expected):
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