singlestoredb 1.15.3__tar.gz → 1.15.5__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.

Potentially problematic release.


This version of singlestoredb might be problematic. Click here for more details.

Files changed (188) hide show
  1. {singlestoredb-1.15.3/singlestoredb.egg-info → singlestoredb-1.15.5}/PKG-INFO +1 -1
  2. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/setup.cfg +1 -1
  3. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/__init__.py +1 -1
  4. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/ext/asgi.py +34 -10
  5. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/fusion/handlers/workspace.py +72 -12
  6. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/http/connection.py +7 -5
  7. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/management/workspace.py +1 -1
  8. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/protocol.py +15 -2
  9. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/notebook/_portal.py +54 -15
  10. singlestoredb-1.15.5/singlestoredb/tests/alltypes.sql +307 -0
  11. singlestoredb-1.15.5/singlestoredb/tests/alltypes_no_nulls.sql +208 -0
  12. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_connection.py +18 -18
  13. {singlestoredb-1.15.3 → singlestoredb-1.15.5/singlestoredb.egg-info}/PKG-INFO +1 -1
  14. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb.egg-info/SOURCES.txt +2 -0
  15. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/LICENSE +0 -0
  16. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/README.md +0 -0
  17. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/accel.c +0 -0
  18. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/setup.py +0 -0
  19. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/ai/__init__.py +0 -0
  20. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/ai/chat.py +0 -0
  21. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/ai/embeddings.py +0 -0
  22. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/alchemy/__init__.py +0 -0
  23. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/apps/__init__.py +0 -0
  24. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/apps/_cloud_functions.py +0 -0
  25. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/apps/_config.py +0 -0
  26. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/apps/_connection_info.py +0 -0
  27. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/apps/_dashboards.py +0 -0
  28. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/apps/_process.py +0 -0
  29. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/apps/_python_udfs.py +0 -0
  30. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/apps/_stdout_supress.py +0 -0
  31. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/apps/_uvicorn_util.py +0 -0
  32. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/auth.py +0 -0
  33. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/config.py +0 -0
  34. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/connection.py +0 -0
  35. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/converters.py +0 -0
  36. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/__init__.py +0 -0
  37. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/attrdoc.py +0 -0
  38. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/common.py +0 -0
  39. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/epydoc.py +0 -0
  40. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/google.py +0 -0
  41. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/numpydoc.py +0 -0
  42. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/parser.py +0 -0
  43. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/py.typed +0 -0
  44. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/rest.py +0 -0
  45. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/tests/__init__.py +0 -0
  46. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/tests/_pydoctor.py +0 -0
  47. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/tests/test_epydoc.py +0 -0
  48. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/tests/test_google.py +0 -0
  49. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/tests/test_numpydoc.py +0 -0
  50. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/tests/test_parse_from_object.py +0 -0
  51. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/tests/test_parser.py +0 -0
  52. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/tests/test_rest.py +0 -0
  53. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/tests/test_util.py +0 -0
  54. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/docstring/util.py +0 -0
  55. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/exceptions.py +0 -0
  56. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/__init__.py +0 -0
  57. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/decorator.py +0 -0
  58. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/dtypes.py +0 -0
  59. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/ext/__init__.py +0 -0
  60. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/ext/arrow.py +0 -0
  61. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/ext/json.py +0 -0
  62. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/ext/mmap.py +0 -0
  63. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/ext/rowdat_1.py +0 -0
  64. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/ext/timer.py +0 -0
  65. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/ext/utils.py +0 -0
  66. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/signature.py +0 -0
  67. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/typing/__init__.py +0 -0
  68. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/typing/numpy.py +0 -0
  69. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/typing/pandas.py +0 -0
  70. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/typing/polars.py +0 -0
  71. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/typing/pyarrow.py +0 -0
  72. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/functions/utils.py +0 -0
  73. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/fusion/__init__.py +0 -0
  74. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/fusion/graphql.py +0 -0
  75. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/fusion/handler.py +0 -0
  76. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/fusion/handlers/__init__.py +0 -0
  77. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/fusion/handlers/export.py +0 -0
  78. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/fusion/handlers/files.py +0 -0
  79. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/fusion/handlers/job.py +0 -0
  80. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/fusion/handlers/models.py +0 -0
  81. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/fusion/handlers/stage.py +0 -0
  82. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/fusion/handlers/utils.py +0 -0
  83. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/fusion/registry.py +0 -0
  84. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/fusion/result.py +0 -0
  85. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/http/__init__.py +0 -0
  86. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/magics/__init__.py +0 -0
  87. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/magics/run_personal.py +0 -0
  88. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/magics/run_shared.py +0 -0
  89. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/management/__init__.py +0 -0
  90. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/management/billing_usage.py +0 -0
  91. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/management/cluster.py +0 -0
  92. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/management/export.py +0 -0
  93. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/management/files.py +0 -0
  94. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/management/inference_api.py +0 -0
  95. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/management/job.py +0 -0
  96. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/management/manager.py +0 -0
  97. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/management/organization.py +0 -0
  98. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/management/region.py +0 -0
  99. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/management/utils.py +0 -0
  100. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/__init__.py +0 -0
  101. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/_auth.py +0 -0
  102. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/charset.py +0 -0
  103. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/connection.py +0 -0
  104. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/constants/CLIENT.py +0 -0
  105. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/constants/COMMAND.py +0 -0
  106. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/constants/CR.py +0 -0
  107. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/constants/ER.py +0 -0
  108. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/constants/EXTENDED_TYPE.py +0 -0
  109. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/constants/FIELD_TYPE.py +0 -0
  110. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/constants/FLAG.py +0 -0
  111. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/constants/SERVER_STATUS.py +0 -0
  112. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/constants/VECTOR_TYPE.py +0 -0
  113. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/constants/__init__.py +0 -0
  114. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/converters.py +0 -0
  115. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/cursors.py +0 -0
  116. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/err.py +0 -0
  117. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/optionfile.py +0 -0
  118. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/__init__.py +0 -0
  119. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/base.py +0 -0
  120. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/conftest.py +0 -0
  121. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/test_DictCursor.py +0 -0
  122. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/test_SSCursor.py +0 -0
  123. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/test_basic.py +0 -0
  124. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/test_connection.py +0 -0
  125. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/test_converters.py +0 -0
  126. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/test_cursor.py +0 -0
  127. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/test_err.py +0 -0
  128. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/test_issues.py +0 -0
  129. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/test_load_local.py +0 -0
  130. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/test_nextset.py +0 -0
  131. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/test_optionfile.py +0 -0
  132. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/thirdparty/__init__.py +0 -0
  133. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/__init__.py +0 -0
  134. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/capabilities.py +0 -0
  135. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/dbapi20.py +0 -0
  136. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py +0 -0
  137. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_dbapi20.py +0 -0
  138. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py +0 -0
  139. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/mysql/times.py +0 -0
  140. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/notebook/__init__.py +0 -0
  141. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/notebook/_objects.py +0 -0
  142. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/py.typed +0 -0
  143. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/pytest.py +0 -0
  144. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/server/__init__.py +0 -0
  145. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/server/docker.py +0 -0
  146. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/server/free_tier.py +0 -0
  147. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/__init__.py +0 -0
  148. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/empty.sql +0 -0
  149. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/ext_funcs/__init__.py +0 -0
  150. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/local_infile.csv +0 -0
  151. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test.ipynb +0 -0
  152. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test.sql +0 -0
  153. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test2.ipynb +0 -0
  154. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test2.sql +0 -0
  155. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_basics.py +0 -0
  156. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_config.py +0 -0
  157. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_dbapi.py +0 -0
  158. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_exceptions.py +0 -0
  159. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_ext_func.py +0 -0
  160. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_ext_func_data.py +0 -0
  161. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_fusion.py +0 -0
  162. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_http.py +0 -0
  163. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_management.py +0 -0
  164. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_plugin.py +0 -0
  165. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_results.py +0 -0
  166. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_types.py +0 -0
  167. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_udf.py +0 -0
  168. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_udf_returns.py +0 -0
  169. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_vectorstore.py +0 -0
  170. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/test_xdict.py +0 -0
  171. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/tests/utils.py +0 -0
  172. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/types.py +0 -0
  173. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/utils/__init__.py +0 -0
  174. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/utils/config.py +0 -0
  175. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/utils/convert_rows.py +0 -0
  176. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/utils/debug.py +0 -0
  177. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/utils/dtypes.py +0 -0
  178. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/utils/events.py +0 -0
  179. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/utils/mogrify.py +0 -0
  180. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/utils/results.py +0 -0
  181. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/utils/xdict.py +0 -0
  182. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb/vectorstore.py +0 -0
  183. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb.egg-info/dependency_links.txt +0 -0
  184. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb.egg-info/entry_points.txt +0 -0
  185. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb.egg-info/requires.txt +0 -0
  186. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/singlestoredb.egg-info/top_level.txt +0 -0
  187. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/sqlx/__init__.py +0 -0
  188. {singlestoredb-1.15.3 → singlestoredb-1.15.5}/sqlx/magic.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: singlestoredb
3
- Version: 1.15.3
3
+ Version: 1.15.5
4
4
  Summary: Interface to the SingleStoreDB database and workspace management APIs
5
5
  Home-page: https://github.com/singlestore-labs/singlestoredb-python
6
6
  Author: SingleStore
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = singlestoredb
3
- version = 1.15.3
3
+ version = 1.15.5
4
4
  description = Interface to the SingleStoreDB database and workspace management APIs
5
5
  long_description = file: README.md
6
6
  long_description_content_type = text/markdown
@@ -13,7 +13,7 @@ Examples
13
13
 
14
14
  """
15
15
 
16
- __version__ = '1.15.3'
16
+ __version__ = '1.15.5'
17
17
 
18
18
  from typing import Any
19
19
 
@@ -708,8 +708,22 @@ class Application(object):
708
708
  # Error response start
709
709
  error_response_dict: Dict[str, Any] = dict(
710
710
  type='http.response.start',
711
- status=401,
712
- headers=[(b'content-type', b'text/plain')],
711
+ status=500,
712
+ headers=[(b'content-type', b'application/json')],
713
+ )
714
+
715
+ # Timeout response start
716
+ timeout_response_dict: Dict[str, Any] = dict(
717
+ type='http.response.start',
718
+ status=504,
719
+ headers=[(b'content-type', b'application/json')],
720
+ )
721
+
722
+ # Cancel response start
723
+ cancel_response_dict: Dict[str, Any] = dict(
724
+ type='http.response.start',
725
+ status=503,
726
+ headers=[(b'content-type', b'application/json')],
713
727
  )
714
728
 
715
729
  # JSON response start
@@ -1233,12 +1247,14 @@ class Application(object):
1233
1247
  'timeout': func_info['timeout'],
1234
1248
  },
1235
1249
  )
1236
- body = (
1237
- '[TimeoutError] Function call timed out after ' +
1238
- str(func_info['timeout']) +
1239
- ' seconds'
1250
+ body = json.dumps(
1251
+ dict(
1252
+ error='[TimeoutError] Function call timed out after ' +
1253
+ str(func_info['timeout']) +
1254
+ ' seconds',
1255
+ ),
1240
1256
  ).encode('utf-8')
1241
- await send(self.error_response_dict)
1257
+ await send(self.timeout_response_dict)
1242
1258
 
1243
1259
  except asyncio.CancelledError:
1244
1260
  self.logger.exception(
@@ -1249,8 +1265,12 @@ class Application(object):
1249
1265
  'function_name': func_name.decode('utf-8'),
1250
1266
  },
1251
1267
  )
1252
- body = b'[CancelledError] Function call was cancelled'
1253
- await send(self.error_response_dict)
1268
+ body = json.dumps(
1269
+ dict(
1270
+ error='[CancelledError] Function call was cancelled',
1271
+ ),
1272
+ ).encode('utf-8')
1273
+ await send(self.cancel_response_dict)
1254
1274
 
1255
1275
  except Exception as e:
1256
1276
  self.logger.exception(
@@ -1262,7 +1282,11 @@ class Application(object):
1262
1282
  'exception_type': type(e).__name__,
1263
1283
  },
1264
1284
  )
1265
- body = f'[{type(e).__name__}] {str(e).strip()}'.encode('utf-8')
1285
+ body = json.dumps(
1286
+ dict(
1287
+ error=f'[{type(e).__name__}] {str(e).strip()}',
1288
+ ),
1289
+ ).encode('utf-8')
1266
1290
  await send(self.error_response_dict)
1267
1291
 
1268
1292
  finally:
@@ -15,7 +15,7 @@ from .utils import get_workspace_manager
15
15
 
16
16
  class UseWorkspaceHandler(SQLHandler):
17
17
  """
18
- USE WORKSPACE workspace [ with_database ];
18
+ USE WORKSPACE workspace [ in_group ] [ with_database ];
19
19
 
20
20
  # Workspace
21
21
  workspace = { workspace_id | workspace_name | current_workspace }
@@ -29,6 +29,15 @@ class UseWorkspaceHandler(SQLHandler):
29
29
  # Current workspace
30
30
  current_workspace = @@CURRENT
31
31
 
32
+ # Workspace group specification
33
+ in_group = IN GROUP { group_id | group_name }
34
+
35
+ # ID of workspace group
36
+ group_id = ID '<group-id>'
37
+
38
+ # Name of workspace group
39
+ group_name = '<group-name>'
40
+
32
41
  # Name of database
33
42
  with_database = WITH DATABASE 'database-name'
34
43
 
@@ -38,13 +47,18 @@ class UseWorkspaceHandler(SQLHandler):
38
47
 
39
48
  Arguments
40
49
  ---------
41
- * ``<workspace-id>``: The ID of the workspace to delete.
42
- * ``<workspace-name>``: The name of the workspace to delete.
50
+ * ``<workspace-id>``: The ID of the workspace to use.
51
+ * ``<workspace-name>``: The name of the workspace to use.
52
+ * ``<group-id>``: The ID of the workspace group to search in.
53
+ * ``<group-name>``: The name of the workspace group to search in.
43
54
 
44
55
  Remarks
45
56
  -------
46
57
  * If you want to specify a database in the current workspace,
47
58
  the workspace name can be specified as ``@@CURRENT``.
59
+ * Use the ``IN GROUP`` clause to specify the ID or name of the workspace
60
+ group where the workspace should be found. If not specified, the current
61
+ workspace group will be used.
48
62
  * Specify the ``WITH DATABASE`` clause to select a default
49
63
  database for the session.
50
64
  * This command only works in a notebook session in the
@@ -57,23 +71,69 @@ class UseWorkspaceHandler(SQLHandler):
57
71
 
58
72
  USE WORKSPACE 'examplews' WITH DATABASE 'dbname';
59
73
 
74
+ The following command sets the workspace to ``examplews`` from a specific
75
+ workspace group::
76
+
77
+ USE WORKSPACE 'examplews' IN GROUP 'my-workspace-group';
78
+
60
79
  """
61
80
  def run(self, params: Dict[str, Any]) -> Optional[FusionSQLResult]:
62
81
  from singlestoredb.notebook import portal
82
+
83
+ # Handle current workspace case
63
84
  if params['workspace'].get('current_workspace'):
64
85
  if params.get('with_database'):
65
86
  portal.default_database = params['with_database']
66
- elif params.get('with_database'):
67
- if params['workspace'].get('workspace_name'):
68
- portal.connection = params['workspace']['workspace_name'], \
69
- params['with_database']
87
+ return None
88
+
89
+ # Get workspace name or ID
90
+ workspace_name = params['workspace'].get('workspace_name')
91
+ workspace_id = params['workspace'].get('workspace_id')
92
+
93
+ # If IN GROUP is specified, look up workspace in that group
94
+ if params.get('in_group'):
95
+ workspace_group = get_workspace_group(params)
96
+
97
+ if workspace_name:
98
+ workspace = workspace_group.workspaces[workspace_name]
99
+ elif workspace_id:
100
+ # Find workspace by ID in the specified group
101
+ workspace = next(
102
+ (w for w in workspace_group.workspaces if w.id == workspace_id),
103
+ None,
104
+ )
105
+ if workspace is None:
106
+ raise KeyError(f'no workspace found with ID: {workspace_id}')
107
+
108
+ workspace_id = workspace.id
109
+
110
+ # Set workspace and database
111
+ if params.get('with_database'):
112
+ if params.get('in_group'):
113
+ # Use 3-element tuple: (workspace_group_id, workspace_name_or_id,
114
+ # database)
115
+ portal.connection = ( # type: ignore[assignment]
116
+ workspace_group.id,
117
+ workspace_name or workspace_id,
118
+ params['with_database'],
119
+ )
70
120
  else:
71
- portal.connection = params['workspace']['workspace_id'], \
72
- params['with_database']
73
- elif params['workspace'].get('workspace_name'):
74
- portal.workspace = params['workspace']['workspace_name']
121
+ # Use 2-element tuple: (workspace_name_or_id, database)
122
+ portal.connection = (
123
+ workspace_name or workspace_id,
124
+ params['with_database'],
125
+ )
75
126
  else:
76
- portal.workspace = params['workspace']['workspace_id']
127
+ if params.get('in_group'):
128
+ # Use 2-element tuple: (workspace_group_id, workspace_name_or_id)
129
+ portal.workspace = ( # type: ignore[assignment]
130
+ workspace_group.id,
131
+ workspace_name or workspace_id,
132
+ )
133
+ else:
134
+ # Use string: workspace_name_or_id
135
+ portal.workspace = workspace_name or workspace_id
136
+
77
137
  return None
78
138
 
79
139
 
@@ -647,23 +647,24 @@ class Cursor(connection.Cursor):
647
647
  type_code = types.ColumnType.get_code(data_type)
648
648
  prec, scale = get_precision_scale(col['dataType'])
649
649
  converter = http_converters.get(type_code, None)
650
+
650
651
  if 'UNSIGNED' in data_type:
651
652
  flags = 32
653
+
652
654
  if data_type.endswith('BLOB') or data_type.endswith('BINARY'):
653
655
  converter = functools.partial(
654
656
  b64decode_converter, converter, # type: ignore
655
657
  )
656
658
  charset = 63 # BINARY
659
+
657
660
  if type_code == 0: # DECIMAL
658
661
  type_code = types.ColumnType.get_code('NEWDECIMAL')
659
662
  elif type_code == 15: # VARCHAR / VARBINARY
660
663
  type_code = types.ColumnType.get_code('VARSTRING')
661
- if type_code == 246 and prec is not None: # NEWDECIMAL
662
- prec += 1 # for sign
663
- if scale is not None and scale > 0:
664
- prec += 1 # for decimal
664
+
665
665
  if converter is not None:
666
666
  convs.append((i, None, converter))
667
+
667
668
  description.append(
668
669
  Description(
669
670
  str(col['name']), type_code,
@@ -673,6 +674,7 @@ class Cursor(connection.Cursor):
673
674
  ),
674
675
  )
675
676
  pymy_res.append(PyMyField(col['name'], flags, charset))
677
+
676
678
  self._descriptions.append(description)
677
679
  self._schemas.append(get_schema(self._results_type, description))
678
680
 
@@ -936,7 +938,7 @@ class Cursor(connection.Cursor):
936
938
 
937
939
  def __iter__(self) -> Iterable[Tuple[Any, ...]]:
938
940
  """Return result iterator."""
939
- return iter(self._rows)
941
+ return iter(self._rows[self._row_idx:])
940
942
 
941
943
  def __enter__(self) -> 'Cursor':
942
944
  """Enter a context."""
@@ -460,7 +460,7 @@ class Stage(FileLocation):
460
460
 
461
461
  """
462
462
  res = self._manager._get(
463
- f'stage/{self._deployment_id}/fs/{stage_path}',
463
+ re.sub(r'/+$', r'/', f'stage/{self._deployment_id}/fs/{stage_path}'),
464
464
  ).json()
465
465
  if recursive:
466
466
  out = []
@@ -324,13 +324,26 @@ class FieldDescriptorPacket(MysqlPacket):
324
324
  raise TypeError(f'unrecognized extended data type: {ext_type_code}')
325
325
 
326
326
  def description(self):
327
- """Provides a 7-item tuple compatible with the Python PEP249 DB Spec."""
327
+ """
328
+ Provides a 9-item tuple.
329
+
330
+ Standard descriptions only have 7 fields according to the Python
331
+ PEP249 DB Spec, but we need to surface information about unsigned
332
+ types and charsetnr for proper type handling.
333
+
334
+ """
335
+ precision = self.get_column_length()
336
+ if self.type_code in (FIELD_TYPE.DECIMAL, FIELD_TYPE.NEWDECIMAL):
337
+ if precision:
338
+ precision -= 1 # for the sign
339
+ if self.scale > 0:
340
+ precision -= 1 # for the decimal point
328
341
  return Description(
329
342
  self.name,
330
343
  self.type_code,
331
344
  None, # TODO: display_length; should this be self.length?
332
345
  self.get_column_length(), # 'internal_size'
333
- self.get_column_length(), # 'precision' # TODO: why!?!?
346
+ precision, # 'precision'
334
347
  self.scale,
335
348
  self.flags % 2 == 0,
336
349
  self.flags,
@@ -10,6 +10,7 @@ from typing import Dict
10
10
  from typing import List
11
11
  from typing import Optional
12
12
  from typing import Tuple
13
+ from typing import Union
13
14
 
14
15
  from . import _objects as obj
15
16
  from ..management import workspace as mgr
@@ -167,15 +168,32 @@ class Portal(object):
167
168
  return obj.workspace
168
169
 
169
170
  @workspace.setter
170
- def workspace(self, name_or_id: str) -> None:
171
+ def workspace(self, workspace_spec: Union[str, Tuple[str, str]]) -> None:
171
172
  """Set workspace."""
172
- if re.match(
173
- r'[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}',
174
- name_or_id, flags=re.I,
175
- ):
176
- w = mgr.get_workspace(name_or_id)
173
+ if isinstance(workspace_spec, tuple):
174
+ # 2-element tuple: (workspace_group_id, workspace_name_or_id)
175
+ workspace_group_id, name_or_id = workspace_spec
176
+ uuid_pattern = (
177
+ r'[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}'
178
+ )
179
+ if re.match(uuid_pattern, name_or_id, flags=re.I):
180
+ w = mgr.get_workspace(name_or_id)
181
+ else:
182
+ w = mgr.get_workspace_group(workspace_group_id).workspaces[
183
+ name_or_id
184
+ ]
177
185
  else:
178
- w = mgr.get_workspace_group(self.workspace_group_id).workspaces[name_or_id]
186
+ # String: workspace_name_or_id (existing behavior)
187
+ name_or_id = workspace_spec
188
+ uuid_pattern = (
189
+ r'[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}'
190
+ )
191
+ if re.match(uuid_pattern, name_or_id, flags=re.I):
192
+ w = mgr.get_workspace(name_or_id)
193
+ else:
194
+ w = mgr.get_workspace_group(
195
+ self.workspace_group_id,
196
+ ).workspaces[name_or_id]
179
197
 
180
198
  if w.state and w.state.lower() not in ['active', 'resumed']:
181
199
  raise RuntimeError('workspace is not active')
@@ -196,16 +214,37 @@ class Portal(object):
196
214
  return self.workspace, self.default_database
197
215
 
198
216
  @connection.setter
199
- def connection(self, workspace_and_default_database: Tuple[str, str]) -> None:
217
+ def connection(
218
+ self,
219
+ connection_spec: Union[Tuple[str, str], Tuple[str, str, str]],
220
+ ) -> None:
200
221
  """Set workspace and default database name."""
201
- name_or_id, default_database = workspace_and_default_database
202
- if re.match(
203
- r'[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}',
204
- name_or_id, flags=re.I,
205
- ):
206
- w = mgr.get_workspace(name_or_id)
222
+ if len(connection_spec) == 3:
223
+ # 3-element tuple: (workspace_group_id, workspace_name_or_id,
224
+ # default_database)
225
+ workspace_group_id, name_or_id, default_database = connection_spec
226
+ uuid_pattern = (
227
+ r'[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}'
228
+ )
229
+ if re.match(uuid_pattern, name_or_id, flags=re.I):
230
+ w = mgr.get_workspace(name_or_id)
231
+ else:
232
+ w = mgr.get_workspace_group(workspace_group_id).workspaces[
233
+ name_or_id
234
+ ]
207
235
  else:
208
- w = mgr.get_workspace_group(self.workspace_group_id).workspaces[name_or_id]
236
+ # 2-element tuple: (workspace_name_or_id, default_database)
237
+ # existing behavior
238
+ name_or_id, default_database = connection_spec
239
+ uuid_pattern = (
240
+ r'[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}'
241
+ )
242
+ if re.match(uuid_pattern, name_or_id, flags=re.I):
243
+ w = mgr.get_workspace(name_or_id)
244
+ else:
245
+ w = mgr.get_workspace_group(
246
+ self.workspace_group_id,
247
+ ).workspaces[name_or_id]
209
248
 
210
249
  if w.state and w.state.lower() not in ['active', 'resumed']:
211
250
  raise RuntimeError('workspace is not active')