singlestoredb 0.4.0__py3-none-any.whl → 1.0.4__py3-none-any.whl

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 (120) hide show
  1. singlestoredb/__init__.py +33 -1
  2. singlestoredb/alchemy/__init__.py +90 -0
  3. singlestoredb/auth.py +5 -1
  4. singlestoredb/config.py +116 -14
  5. singlestoredb/connection.py +483 -516
  6. singlestoredb/converters.py +238 -135
  7. singlestoredb/exceptions.py +30 -2
  8. singlestoredb/functions/__init__.py +1 -0
  9. singlestoredb/functions/decorator.py +142 -0
  10. singlestoredb/functions/dtypes.py +1639 -0
  11. singlestoredb/functions/ext/__init__.py +2 -0
  12. singlestoredb/functions/ext/arrow.py +375 -0
  13. singlestoredb/functions/ext/asgi.py +661 -0
  14. singlestoredb/functions/ext/json.py +427 -0
  15. singlestoredb/functions/ext/mmap.py +306 -0
  16. singlestoredb/functions/ext/rowdat_1.py +744 -0
  17. singlestoredb/functions/signature.py +673 -0
  18. singlestoredb/fusion/__init__.py +11 -0
  19. singlestoredb/fusion/graphql.py +213 -0
  20. singlestoredb/fusion/handler.py +621 -0
  21. singlestoredb/fusion/handlers/stage.py +257 -0
  22. singlestoredb/fusion/handlers/utils.py +162 -0
  23. singlestoredb/fusion/handlers/workspace.py +412 -0
  24. singlestoredb/fusion/registry.py +164 -0
  25. singlestoredb/fusion/result.py +399 -0
  26. singlestoredb/http/__init__.py +27 -0
  27. singlestoredb/{http.py → http/connection.py} +555 -154
  28. singlestoredb/management/__init__.py +3 -0
  29. singlestoredb/management/billing_usage.py +148 -0
  30. singlestoredb/management/cluster.py +14 -6
  31. singlestoredb/management/manager.py +100 -38
  32. singlestoredb/management/organization.py +188 -0
  33. singlestoredb/management/region.py +5 -5
  34. singlestoredb/management/utils.py +281 -2
  35. singlestoredb/management/workspace.py +1344 -49
  36. singlestoredb/{clients/pymysqlsv → mysql}/__init__.py +16 -21
  37. singlestoredb/{clients/pymysqlsv → mysql}/_auth.py +39 -8
  38. singlestoredb/{clients/pymysqlsv → mysql}/charset.py +26 -23
  39. singlestoredb/{clients/pymysqlsv/connections.py → mysql/connection.py} +532 -165
  40. singlestoredb/{clients/pymysqlsv → mysql}/constants/CLIENT.py +0 -1
  41. singlestoredb/{clients/pymysqlsv → mysql}/constants/COMMAND.py +0 -1
  42. singlestoredb/{clients/pymysqlsv → mysql}/constants/CR.py +0 -2
  43. singlestoredb/{clients/pymysqlsv → mysql}/constants/ER.py +0 -1
  44. singlestoredb/{clients/pymysqlsv → mysql}/constants/FIELD_TYPE.py +1 -1
  45. singlestoredb/{clients/pymysqlsv → mysql}/constants/FLAG.py +0 -1
  46. singlestoredb/{clients/pymysqlsv → mysql}/constants/SERVER_STATUS.py +0 -1
  47. singlestoredb/mysql/converters.py +271 -0
  48. singlestoredb/{clients/pymysqlsv → mysql}/cursors.py +228 -112
  49. singlestoredb/mysql/err.py +92 -0
  50. singlestoredb/{clients/pymysqlsv → mysql}/optionfile.py +5 -4
  51. singlestoredb/{clients/pymysqlsv → mysql}/protocol.py +49 -20
  52. singlestoredb/mysql/tests/__init__.py +19 -0
  53. singlestoredb/{clients/pymysqlsv → mysql}/tests/base.py +32 -12
  54. singlestoredb/mysql/tests/conftest.py +37 -0
  55. singlestoredb/{clients/pymysqlsv → mysql}/tests/test_DictCursor.py +11 -7
  56. singlestoredb/{clients/pymysqlsv → mysql}/tests/test_SSCursor.py +17 -12
  57. singlestoredb/{clients/pymysqlsv → mysql}/tests/test_basic.py +32 -24
  58. singlestoredb/{clients/pymysqlsv → mysql}/tests/test_connection.py +130 -119
  59. singlestoredb/{clients/pymysqlsv → mysql}/tests/test_converters.py +9 -7
  60. singlestoredb/mysql/tests/test_cursor.py +141 -0
  61. singlestoredb/{clients/pymysqlsv → mysql}/tests/test_err.py +3 -2
  62. singlestoredb/{clients/pymysqlsv → mysql}/tests/test_issues.py +35 -27
  63. singlestoredb/{clients/pymysqlsv → mysql}/tests/test_load_local.py +13 -11
  64. singlestoredb/{clients/pymysqlsv → mysql}/tests/test_nextset.py +7 -3
  65. singlestoredb/{clients/pymysqlsv → mysql}/tests/test_optionfile.py +2 -1
  66. singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/__init__.py +1 -1
  67. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/__init__.py +9 -0
  68. singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/test_MySQLdb/capabilities.py +19 -17
  69. singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/test_MySQLdb/dbapi20.py +31 -22
  70. singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py +3 -4
  71. singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/test_MySQLdb/test_MySQLdb_dbapi20.py +24 -20
  72. singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py +4 -4
  73. singlestoredb/{clients/pymysqlsv → mysql}/times.py +3 -4
  74. singlestoredb/pytest.py +283 -0
  75. singlestoredb/tests/empty.sql +0 -0
  76. singlestoredb/tests/ext_funcs/__init__.py +385 -0
  77. singlestoredb/tests/test.sql +210 -0
  78. singlestoredb/tests/test2.sql +1 -0
  79. singlestoredb/tests/test_basics.py +482 -115
  80. singlestoredb/tests/test_config.py +13 -13
  81. singlestoredb/tests/test_connection.py +241 -305
  82. singlestoredb/tests/test_dbapi.py +27 -0
  83. singlestoredb/tests/test_ext_func.py +1193 -0
  84. singlestoredb/tests/test_ext_func_data.py +1101 -0
  85. singlestoredb/tests/test_fusion.py +465 -0
  86. singlestoredb/tests/test_http.py +32 -26
  87. singlestoredb/tests/test_management.py +588 -8
  88. singlestoredb/tests/test_plugin.py +33 -0
  89. singlestoredb/tests/test_results.py +11 -12
  90. singlestoredb/tests/test_udf.py +687 -0
  91. singlestoredb/tests/utils.py +3 -2
  92. singlestoredb/utils/config.py +58 -0
  93. singlestoredb/utils/debug.py +13 -0
  94. singlestoredb/utils/mogrify.py +151 -0
  95. singlestoredb/utils/results.py +4 -1
  96. singlestoredb-1.0.4.dist-info/METADATA +139 -0
  97. singlestoredb-1.0.4.dist-info/RECORD +112 -0
  98. {singlestoredb-0.4.0.dist-info → singlestoredb-1.0.4.dist-info}/WHEEL +1 -1
  99. singlestoredb-1.0.4.dist-info/entry_points.txt +2 -0
  100. singlestoredb/clients/pymysqlsv/converters.py +0 -365
  101. singlestoredb/clients/pymysqlsv/err.py +0 -144
  102. singlestoredb/clients/pymysqlsv/tests/__init__.py +0 -19
  103. singlestoredb/clients/pymysqlsv/tests/test_cursor.py +0 -133
  104. singlestoredb/clients/pymysqlsv/tests/thirdparty/test_MySQLdb/__init__.py +0 -9
  105. singlestoredb/drivers/__init__.py +0 -45
  106. singlestoredb/drivers/base.py +0 -198
  107. singlestoredb/drivers/cymysql.py +0 -38
  108. singlestoredb/drivers/http.py +0 -47
  109. singlestoredb/drivers/mariadb.py +0 -40
  110. singlestoredb/drivers/mysqlconnector.py +0 -49
  111. singlestoredb/drivers/mysqldb.py +0 -60
  112. singlestoredb/drivers/pymysql.py +0 -37
  113. singlestoredb/drivers/pymysqlsv.py +0 -35
  114. singlestoredb/drivers/pyodbc.py +0 -65
  115. singlestoredb-0.4.0.dist-info/METADATA +0 -111
  116. singlestoredb-0.4.0.dist-info/RECORD +0 -86
  117. /singlestoredb/{clients → fusion/handlers}/__init__.py +0 -0
  118. /singlestoredb/{clients/pymysqlsv → mysql}/constants/__init__.py +0 -0
  119. {singlestoredb-0.4.0.dist-info → singlestoredb-1.0.4.dist-info}/LICENSE +0 -0
  120. {singlestoredb-0.4.0.dist-info → singlestoredb-1.0.4.dist-info}/top_level.txt +0 -0
@@ -86,11 +86,12 @@ def load_sql(sql_file: str) -> str:
86
86
  if cmd:
87
87
  cmd += ';'
88
88
  cur.execute(cmd)
89
- else:
89
+
90
+ elif not conn.driver.startswith('http'):
90
91
  cur.execute(f'USE {dbname};')
91
92
 
92
93
  # Start HTTP server as needed.
93
- if http_port:
94
+ if http_port and not conn.driver.startswith('http'):
94
95
  cur.execute(f'SET GLOBAL HTTP_PROXY_PORT={http_port};')
95
96
  cur.execute('SET GLOBAL HTTP_API=ON;')
96
97
  cur.execute('RESTART PROXY;')
@@ -32,6 +32,7 @@ from typing import Callable
32
32
  from typing import Dict
33
33
  from typing import Iterator
34
34
  from typing import List
35
+ from typing import Mapping
35
36
  from typing import Optional
36
37
  from typing import Tuple
37
38
  from typing import Union
@@ -562,6 +563,28 @@ def check_bool(value: Union[bool, int]) -> bool:
562
563
  raise ValueError('%s is not a recognized bool value')
563
564
 
564
565
 
566
+ def check_optional_bool(value: Optional[Union[bool, int]]) -> Optional[bool]:
567
+ """
568
+ Validate an optional bool value.
569
+
570
+ Parameters
571
+ ----------
572
+ value : int or bool or None
573
+ The value to validate. If specified as an integer, it must
574
+ be either 0 for False or 1 for True.
575
+
576
+ Returns
577
+ -------
578
+ bool
579
+ The validated bool
580
+
581
+ """
582
+ if value is None:
583
+ return None
584
+
585
+ return check_bool(value)
586
+
587
+
565
588
  def check_str(
566
589
  value: Any,
567
590
  pattern: Optional[str] = None,
@@ -623,6 +646,41 @@ def check_str(
623
646
  return out
624
647
 
625
648
 
649
+ def check_dict_str_str(
650
+ value: Any,
651
+ ) -> Optional[Dict[str, str]]:
652
+ """
653
+ Validate a string value.
654
+
655
+ Parameters
656
+ ----------
657
+ value : dict
658
+ The value to validate. Keys and values must be strings.
659
+
660
+ Returns
661
+ -------
662
+ dict
663
+ The validated dict value
664
+ """
665
+ if value is None:
666
+ return None
667
+
668
+ if not isinstance(value, Mapping):
669
+ raise ValueError(
670
+ 'value {} must be of type dict'.format(value),
671
+ )
672
+
673
+ out = {}
674
+ for k, v in value.items():
675
+ if not isinstance(k, str) or not isinstance(v, str):
676
+ raise ValueError(
677
+ 'keys and values in {} must be strings'.format(value),
678
+ )
679
+ out[k] = v
680
+
681
+ return out
682
+
683
+
626
684
  def check_url(
627
685
  value: str,
628
686
  pattern: Optional[str] = None,
@@ -0,0 +1,13 @@
1
+ import sys
2
+ from typing import Any
3
+
4
+ from ..config import get_option
5
+
6
+
7
+ def log_query(query: str, args: Any = None) -> None:
8
+ """Log the query and parameters."""
9
+ if get_option('debug.queries'):
10
+ if args is None:
11
+ print('[QUERY]', query, file=sys.stderr)
12
+ else:
13
+ print('[QUERY]', query, args, file=sys.stderr)
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env python3
2
+ from typing import Any
3
+ from typing import Dict
4
+ from typing import Optional
5
+ from typing import Sequence
6
+ from typing import Union
7
+
8
+ from ..mysql import converters
9
+ from ..mysql.constants import SERVER_STATUS
10
+
11
+
12
+ Encoders = converters.Encoders
13
+
14
+
15
+ def escape(
16
+ obj: Any,
17
+ charset: str = 'utf8',
18
+ mapping: Optional[Encoders] = None,
19
+ server_status: int = 0,
20
+ binary_prefix: bool = False,
21
+ ) -> str:
22
+ """
23
+ Escape whatever value is passed.
24
+
25
+ Non-standard, for internal use; do not use this in your applications.
26
+
27
+ """
28
+ dtype = type(obj)
29
+ if dtype is str or isinstance(obj, str):
30
+ return "'{}'".format(escape_string(obj, server_status=server_status))
31
+ if dtype is bytes or dtype is bytearray or isinstance(obj, (bytes, bytearray)):
32
+ return _quote_bytes(
33
+ obj,
34
+ server_status=server_status,
35
+ binary_prefix=binary_prefix,
36
+ )
37
+ if mapping is None:
38
+ mapping = converters.encoders
39
+ return converters.escape_item(obj, charset, mapping=mapping)
40
+
41
+
42
+ def literal(
43
+ obj: Any,
44
+ charset: str = 'utf8',
45
+ encoders: Optional[Encoders] = None,
46
+ server_status: int = 0,
47
+ binary_prefix: bool = False,
48
+ ) -> str:
49
+ """
50
+ Alias for escape().
51
+
52
+ Non-standard, for internal use; do not use this in your applications.
53
+
54
+ """
55
+ return escape(
56
+ obj, charset=charset, mapping=encoders,
57
+ server_status=server_status, binary_prefix=binary_prefix,
58
+ )
59
+
60
+
61
+ def escape_string(
62
+ s: str,
63
+ server_status: int = 0,
64
+ ) -> str:
65
+ """Escape a string value."""
66
+ if server_status & SERVER_STATUS.SERVER_STATUS_NO_BACKSLASH_ESCAPES:
67
+ return s.replace("'", "''")
68
+ return converters.escape_string(s)
69
+
70
+
71
+ def _quote_bytes(
72
+ s: bytes,
73
+ server_status: int = 0,
74
+ binary_prefix: bool = False,
75
+ ) -> str:
76
+ if server_status & SERVER_STATUS.SERVER_STATUS_NO_BACKSLASH_ESCAPES:
77
+ if binary_prefix:
78
+ return "_binary X'{}'".format(s.hex())
79
+ return "X'{}'".format(s.hex())
80
+ return converters.escape_bytes(s)
81
+
82
+
83
+ def _escape_args(
84
+ args: Union[Sequence[Any], Dict[str, Any], None],
85
+ charset: str = 'utf8',
86
+ encoders: Optional[Encoders] = None,
87
+ server_status: int = 0,
88
+ binary_prefix: bool = False,
89
+ ) -> Any:
90
+ if encoders is None:
91
+ encoders = converters.encoders
92
+
93
+ if isinstance(args, (tuple, list)):
94
+ return tuple(
95
+ literal(
96
+ arg, charset=charset, encoders=encoders,
97
+ server_status=server_status,
98
+ binary_prefix=binary_prefix,
99
+ ) for arg in args
100
+ )
101
+
102
+ elif isinstance(args, dict):
103
+ return {
104
+ key: literal(
105
+ val, charset=charset, encoders=encoders,
106
+ server_status=server_status,
107
+ binary_prefix=binary_prefix,
108
+ ) for (key, val) in args.items()
109
+ }
110
+
111
+ # If it's not a dictionary let's try escaping it anyways.
112
+ # Worst case it will throw a Value error
113
+ return escape(
114
+ args, charset=charset, mapping=encoders,
115
+ server_status=server_status, binary_prefix=binary_prefix,
116
+ )
117
+
118
+
119
+ def mogrify(
120
+ query: Union[str, bytes],
121
+ args: Union[Sequence[Any], Dict[str, Any], None] = None,
122
+ charset: str = 'utf8',
123
+ encoders: Optional[Encoders] = None,
124
+ server_status: int = 0,
125
+ binary_prefix: bool = False,
126
+ ) -> Union[str, bytes]:
127
+ """
128
+ Returns the exact string sent to the database by calling the execute() method.
129
+
130
+ This method follows the extension to the DB API 2.0 followed by Psycopg.
131
+
132
+ Parameters
133
+ ----------
134
+ query : str
135
+ Query to mogrify.
136
+ args : Sequence[Any] or Dict[str, Any] or Any, optional
137
+ Parameters used with query. (optional)
138
+
139
+ Returns
140
+ -------
141
+ str : The query with argument binding applied.
142
+
143
+ """
144
+ if args:
145
+ query = query % _escape_args(
146
+ args, charset=charset,
147
+ encoders=encoders,
148
+ server_status=server_status,
149
+ binary_prefix=binary_prefix,
150
+ )
151
+ return query
@@ -28,7 +28,7 @@ class Description(NamedTuple):
28
28
  """Column definition."""
29
29
 
30
30
  name: str
31
- type_code: str
31
+ type_code: int
32
32
  display_size: Optional[int]
33
33
  internal_size: Optional[int]
34
34
  precision: Optional[int]
@@ -190,8 +190,11 @@ _converters: Dict[
190
190
  ],
191
191
  ] = {
192
192
  'tuple': results_to_tuple,
193
+ 'tuples': results_to_tuple,
193
194
  'namedtuple': results_to_namedtuple,
195
+ 'namedtuples': results_to_namedtuple,
194
196
  'dict': results_to_dict,
197
+ 'dicts': results_to_dict,
195
198
  'dataframe': results_to_dataframe,
196
199
  }
197
200
 
@@ -0,0 +1,139 @@
1
+ Metadata-Version: 2.1
2
+ Name: singlestoredb
3
+ Version: 1.0.4
4
+ Summary: Interface to the SingleStoreDB database and workspace management APIs
5
+ Home-page: https://github.com/singlestore-labs/singlestoredb-python
6
+ Author: SingleStore
7
+ Author-email: support@singlestore.com
8
+ License: Apache-2.0
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: License :: OSI Approved :: Apache Software License
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3 :: Only
13
+ Classifier: Topic :: Database
14
+ Requires-Python: >=3.8
15
+ Description-Content-Type: text/markdown
16
+ License-File: LICENSE
17
+ Requires-Dist: PyJWT
18
+ Requires-Dist: build
19
+ Requires-Dist: parsimonious
20
+ Requires-Dist: requests
21
+ Requires-Dist: setuptools
22
+ Requires-Dist: sqlparams
23
+ Requires-Dist: wheel
24
+ Provides-Extra: dataframe
25
+ Requires-Dist: ibis-singlestoredb ; extra == 'dataframe'
26
+ Provides-Extra: dbt
27
+ Requires-Dist: dbt-singlestore ; extra == 'dbt'
28
+ Provides-Extra: ed22519
29
+ Requires-Dist: PyNaCl >=1.4.0 ; extra == 'ed22519'
30
+ Provides-Extra: gssapi
31
+ Requires-Dist: gssapi ; extra == 'gssapi'
32
+ Provides-Extra: ibis
33
+ Requires-Dist: ibis-singlestoredb ; extra == 'ibis'
34
+ Provides-Extra: kerberos
35
+ Requires-Dist: gssapi ; extra == 'kerberos'
36
+ Provides-Extra: pytest
37
+ Requires-Dist: pytest ; extra == 'pytest'
38
+ Provides-Extra: rsa
39
+ Requires-Dist: cryptography ; extra == 'rsa'
40
+ Provides-Extra: sqlalchemy
41
+ Requires-Dist: sqlalchemy-singlestoredb >=1.0.0 ; extra == 'sqlalchemy'
42
+
43
+ # <img src="https://github.com/singlestore-labs/singlestoredb-python/blob/main/resources/singlestore-logo.png" height="60" valign="middle"/> SingleStoreDB Python SDK
44
+
45
+ This project contains a [DB-API 2.0](https://www.python.org/dev/peps/pep-0249/)
46
+ compatible Python interface to the SingleStore database and workspace management API.
47
+
48
+ ## Install
49
+
50
+ This package can be install from PyPI using `pip`:
51
+ ```
52
+ pip install singlestoredb
53
+ ```
54
+
55
+ ## Documentation
56
+
57
+ https://singlestore-labs.github.io/singlestoredb-python
58
+
59
+ ## Usage
60
+
61
+ Connections to the SingleStore database are made using the DB-API parameters
62
+ `host`, `port`, `user`, `password`, etc, but they may also be done using
63
+ URLs that specify these parameters as well (much like the
64
+ [SQLAlchemy](https://www.sqlalchemy.org) package).
65
+ ```
66
+ import singlestoredb as s2
67
+
68
+ # Connect using the default connector
69
+ conn = s2.connect('user:password@host:3306/db_name')
70
+
71
+ # Create a cursor
72
+ cur = conn.cursor()
73
+
74
+ # Execute SQL
75
+ cur.execute('select * from foo')
76
+
77
+ # Fetch the results
78
+ print(cur.description)
79
+ for item in cur:
80
+ print(item)
81
+
82
+ # Close the connection
83
+ conn.close()
84
+ ```
85
+
86
+ Connecting to the HTTP API is done as follows:
87
+ ```
88
+ # Use the HTTP API connector
89
+ conn = s2.connect('https://user:password@host:8080/db_name')
90
+ ```
91
+
92
+ ## Performance
93
+
94
+ While this package is based on [PyMySQL](https://github.com/PyMySQL/PyMySQL)
95
+ which is a pure Python-based MySQL connector, it adds various performance
96
+ enhancements that make it faster than most other connectors. The performance
97
+ improvements come from changes to the data conversion functions, cursor implementations,
98
+ and a C extension that is highly optimized to improve row data reading.
99
+
100
+ The package can be used both in a pure Python mode and as well as a C accelerated
101
+ mode. Generally speaking, the C accelerated version of the client can read
102
+ data 10X faster than PyMySQL, 2X faster than MySQLdb, and 1.5X faster than
103
+ mysql.connector. All of this is done without having to install any 3rd party
104
+ MySQL libraries!
105
+
106
+ Benchmarking was done with a table of 3,533,286 rows each containing a datetime,
107
+ a float, and eight character columns. The data is the same data set used in
108
+ [this article](https://www.singlestore.com/blog/how-to-get-started-with-singlestore/).
109
+ The client and server were running on the same machine and queries were made
110
+ using `fetchone`, `fetchall`, `fetchmany(1000)`, and an iterator over the cursor
111
+ object (e.g., `iter(cur)`). The results are shown below.
112
+
113
+ ### Buffered
114
+
115
+ | | PyMySQL | MySQLdb | mysql.connector | SingleStore (pure Python) | SingleStore |
116
+ |-------------------------|---------|---------|-----------------|---------------------------|-------------|
117
+ | fetchall | 37.0s | 8.7s | 5.6s | 29.0s | 3.7s |
118
+ | fetchmany(1000) | 37.4s | 9.2s | 6.2s | 29.6s | 3.6s |
119
+ | fetchone | 38.2s | 10.1s | 10.2s | 30.9s | 4.8s |
120
+ | iter(cur) | 38.3s | 9.1s | 10.2s | 30.4s | 4.4s |
121
+
122
+ ### Unbuffered
123
+
124
+ | | PyMySQL | MySQLdb | mysql.connector | SingleStore (pure Python) | SingleStore |
125
+ |-------------------------|---------|---------|-----------------|---------------------------|-------------|
126
+ | fetchall | 39.0s | 6.5s | 5.5s | 30.3s | 5.5s |
127
+ | fetchmany(1000) | 39.4s | 7.0s | 6.0s | 30.4s | 4.1s |
128
+ | fetchone | 34.5s | 8.9s | 10.1s | 30.8s | 6.6s |
129
+ | iter(cur) | 39.0s | 9.0s | 10.2s | 31.4s | 6.0s |
130
+
131
+
132
+ ## License
133
+
134
+ This library is licensed under the [Apache 2.0 License](https://raw.githubusercontent.com/singlestore-labs/singlestoredb-python/main/LICENSE?token=GHSAT0AAAAAABMGV6QPNR6N23BVICDYK5LAYTVK5EA).
135
+
136
+ ## Resources
137
+
138
+ * [SingleStore](https://singlestore.com)
139
+ * [Python](https://python.org)
@@ -0,0 +1,112 @@
1
+ singlestoredb/__init__.py,sha256=viRBrAKqkgdSWpFXvWnozGcsk0jjaoyLKBQ6xcy4McU,1634
2
+ singlestoredb/auth.py,sha256=u8D9tpKzrqa4ssaHjyZnGDX1q8XBpGtuoOkTkSv7B28,7599
3
+ singlestoredb/config.py,sha256=Xaipos7C0bLTM2EBsuBXRuA4NI-AL3Attb7KC-DqlSg,7856
4
+ singlestoredb/connection.py,sha256=gDBIs3XgLOROVHtzMx9zmSYILc0aRVY7k8we3b4TxCw,44227
5
+ singlestoredb/converters.py,sha256=aH_QhLr94i9_AjvcplTar0HfX2yi53KGxHHzJc7lSU0,12515
6
+ singlestoredb/exceptions.py,sha256=HuoA6sMRL5qiCiee-_5ddTGmFbYC9Euk8TYUsh5GvTw,3234
7
+ singlestoredb/pytest.py,sha256=OyF3BO9mgxenifYhOihnzGk8WzCJ_zN5_mxe8XyFPOc,9074
8
+ singlestoredb/types.py,sha256=FIqO1A7e0Gkk7ITmIysBy-P5S--ItbMSlYvblzqGS30,9969
9
+ singlestoredb/alchemy/__init__.py,sha256=dXRThusYrs_9GjrhPOw0-vw94in_T8yY9jE7SGCqiQk,2523
10
+ singlestoredb/functions/__init__.py,sha256=WL1LqgMTdnGOse3tQqmD-HH8TdfCPS89GNO7hO0v_aw,41
11
+ singlestoredb/functions/decorator.py,sha256=H12MUeBw8VOppx6esntaR43ukeIffbnAr716CBpYJ4g,5193
12
+ singlestoredb/functions/dtypes.py,sha256=iP3_AvE2jBxlkziOHzoUvTtYCdBZlaxJHNgvGwp07Ao,36712
13
+ singlestoredb/functions/signature.py,sha256=fNnlTfc0R0sM9wm78UwG7Ok9eMJTtOfawrIpjts2wdY,18866
14
+ singlestoredb/functions/ext/__init__.py,sha256=kGCV3QC5pL95TytpI8pwvSVCqqoTrV8duQQEUp65sy4,66
15
+ singlestoredb/functions/ext/arrow.py,sha256=WB7n1ACslyd8nlbFzUvlbxn1BVuEjA9-BGBEqCWlSOo,9061
16
+ singlestoredb/functions/ext/asgi.py,sha256=3Rp0m2DNf5yzbCQpaazTTVoDCPfp3jT6dJ7MlvHijw0,21938
17
+ singlestoredb/functions/ext/json.py,sha256=UuUxTzlr5ztAbXqOGaVGUhO7xFN_oBY75nFh9B8cRog,10372
18
+ singlestoredb/functions/ext/mmap.py,sha256=lvdKiGPh-H7LfkrYbPvcH5BWv9zuz7t2FAvW-nYdWzI,9759
19
+ singlestoredb/functions/ext/rowdat_1.py,sha256=yZElsItSbVTFlXU3N-ee6QIybxuksqwv1UE3Y6h45c0,22274
20
+ singlestoredb/fusion/__init__.py,sha256=Qo7SuqGw-l-vE8-EI2jhm6hXJkYfOLUKIws9c7LFNX0,356
21
+ singlestoredb/fusion/graphql.py,sha256=ZA3HcDq5rER-dCEavwTqnF7KM0D2LCYIY7nLQk7lSso,5207
22
+ singlestoredb/fusion/handler.py,sha256=7Oau7A5mclO5t3egH2FINxo8By6zpwzAQLCMFIo9CCo,18338
23
+ singlestoredb/fusion/registry.py,sha256=xpaWO9Bne5QYSE0ump1NcyHimFQSYW49gu3NSPBhLCI,4084
24
+ singlestoredb/fusion/result.py,sha256=Bd3KbRpqWqQcWp_Chd4bzBy8Kfc8nXLS_Pn_GGbPO6o,11772
25
+ singlestoredb/fusion/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ singlestoredb/fusion/handlers/stage.py,sha256=Abj59HZyy7kUWwujG-7FZ9-8d14W3XWRc3XfOMgBeng,6386
27
+ singlestoredb/fusion/handlers/utils.py,sha256=oYbf13Y3orEkJfHMNnO7B_W1anEdK-0S9vVVkF2pPFk,5109
28
+ singlestoredb/fusion/handlers/workspace.py,sha256=hHE6ZTrt3wWnQsTMkEiiWWFiQend4VNTebX382Ot5FI,11342
29
+ singlestoredb/http/__init__.py,sha256=A_2ZUCCpvRYIA6YDpPy57wL5R1eZ5SfP6I1To5nfJ2s,912
30
+ singlestoredb/http/connection.py,sha256=YcUfY_GzpSz-XYTkVQCayct9eQvwhscwVfStLbNry_U,37410
31
+ singlestoredb/management/__init__.py,sha256=jXtKvpvl5diiotXPiEi2EpJwhPLEMb4_MTpndjCz3Kg,202
32
+ singlestoredb/management/billing_usage.py,sha256=9ighjIpcopgIyJOktBYQ6pahBZmWGHOPyyCW4gu9FGs,3735
33
+ singlestoredb/management/cluster.py,sha256=_TT4tV43VPDrtcdS_VN-TTYij7yFQzjAMeuYRF9zKj8,14362
34
+ singlestoredb/management/manager.py,sha256=m8I5zTmEqjMCEE4fmmVdzza8TvofhnIHvO0np0WH-Y8,8810
35
+ singlestoredb/management/organization.py,sha256=Oj4-VQoEc90hLQ9vxXu4fSrGWK_Qq5lftmkM1Q5l6lk,4916
36
+ singlestoredb/management/region.py,sha256=HnLcWUh7r_aLECliplCDHak4a_F3B7LOSXEYMW66qD0,1611
37
+ singlestoredb/management/utils.py,sha256=sJlAmvHsqvgkFmpyXd4qIDoVi0Mxh9KGBGf_uF3cU4g,9197
38
+ singlestoredb/management/workspace.py,sha256=gea-ehcd_HlmjqfiEeW7w9nMOG3aLsIW9xDPGjWELXs,59380
39
+ singlestoredb/mysql/__init__.py,sha256=olUTAvkiERhDW41JXQMawkg-i0tvBEkoTkII1tt6lxU,4492
40
+ singlestoredb/mysql/_auth.py,sha256=AugRitoUwgRIDFuJxuAH4MWIAmckY7Ji2pP6r_Ng9dY,8043
41
+ singlestoredb/mysql/charset.py,sha256=-FlONDS_oAUF5B3mIgeHBPb_SCt4zHD33arUeBNctU0,10510
42
+ singlestoredb/mysql/connection.py,sha256=VzVZTSRdRcJ521rkFeZVmeYPkV_LDxLjDrxEJ6fHZhg,64746
43
+ singlestoredb/mysql/converters.py,sha256=CVe8SDmjbIAhy1xpQ2N5OKWw6t5eWpw-EU3QTlA0Hh0,7500
44
+ singlestoredb/mysql/cursors.py,sha256=aWs4AzmeZJJltOmUU3GZNBWgod9nqnnFW5OHVquz5t0,21246
45
+ singlestoredb/mysql/err.py,sha256=-m5rqXi8yhq6b8SCEJ2h0E5Rudh_15dlAU_WbJ1YrM8,2388
46
+ singlestoredb/mysql/optionfile.py,sha256=DqL-rOQcqQncD5eVbPRkwZqo7Pj3Vh40VLx3E_e87TU,655
47
+ singlestoredb/mysql/protocol.py,sha256=mPkF1xfSbqoW2dr8Tk4MpOKXRs_5Qj6xGFWSxo-AwhA,12180
48
+ singlestoredb/mysql/times.py,sha256=2j7purNVnJmjhOUgwUze-r3kNlCWqxjXj-jtqOzBfZI,463
49
+ singlestoredb/mysql/constants/CLIENT.py,sha256=SSvMFPZCTVMU1UWa4zOrfhYMDdR2wG2mS0E5GzJhDsg,878
50
+ singlestoredb/mysql/constants/COMMAND.py,sha256=TGITAUcNWlq2Gwg2wv5UK2ykdTd4LYTk_EcJJOCpGIc,679
51
+ singlestoredb/mysql/constants/CR.py,sha256=z3Oa86nHVDgWcz_XYFOzkfvvfkZmEoNluzpbNOJxjKg,2305
52
+ singlestoredb/mysql/constants/ER.py,sha256=cH5wgU-e70wd0uSygNR5IFCnnXcrR9WLwJPMH22bhUw,12296
53
+ singlestoredb/mysql/constants/FIELD_TYPE.py,sha256=OU0MQ_NtfLEFG5Jy0Oay7rhhlkfGldyzxjf1rGaSN2M,382
54
+ singlestoredb/mysql/constants/FLAG.py,sha256=Fy-PrCLnUI7fx_o5WypYnUAzWAM0E9d5yL8fFRVKffY,214
55
+ singlestoredb/mysql/constants/SERVER_STATUS.py,sha256=m28Iq5JGCFCWLhafE73-iOvw_9gDGqnytW3NkHpbugA,333
56
+ singlestoredb/mysql/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
+ singlestoredb/mysql/tests/__init__.py,sha256=JFzNFYLRD6dxD9ZvGgGIZOWPMYKW8b4tywBsb_I51J4,997
58
+ singlestoredb/mysql/tests/base.py,sha256=sv_VpPrJDvCt2QRlikG6_YWU3yJX3KEkdc96YRXGvEI,4025
59
+ singlestoredb/mysql/tests/conftest.py,sha256=vWjt2DEnzwlXuOBbz3p_EZXXDopucKGXHsPPPmCAmms,1117
60
+ singlestoredb/mysql/tests/test_DictCursor.py,sha256=oxn_q4DJTT6XqByCzKt0zQYw24_k768_8YJhpYUkDmE,4878
61
+ singlestoredb/mysql/tests/test_SSCursor.py,sha256=1IySbqn6a-1Wt7S04HxO3mUZstVmKIuy0vF8B0ZT06I,4306
62
+ singlestoredb/mysql/tests/test_basic.py,sha256=MsOP0zCvH9Kx1F1guLG4Iiir5ePD-3In_PCNyAJp1Cc,15465
63
+ singlestoredb/mysql/tests/test_connection.py,sha256=MRS4mU9pO4-Ga2GYWRdo640CHH7PTZtucdqB278Srlg,32297
64
+ singlestoredb/mysql/tests/test_converters.py,sha256=lNxgzbkfhw55mYFwSczUJeJHOsY-jXSqjeihdEQuV0w,2002
65
+ singlestoredb/mysql/tests/test_cursor.py,sha256=1OGzKzf7UCcF96X2XN8GnB9xIiUVyXn4GOuzW7hp6Cw,5045
66
+ singlestoredb/mysql/tests/test_err.py,sha256=nxMjsP9aCHT58aIPIrFyPveo2UZaHMYz4voDgY4Wnr0,422
67
+ singlestoredb/mysql/tests/test_issues.py,sha256=Rv0IJaYQu_u88O_pgURpT6V8Eo-cMitjpV59hT9EKrI,18965
68
+ singlestoredb/mysql/tests/test_load_local.py,sha256=EVz1O9LDR31GrvU97eEpBddHaTUhX-zifdUvgCFuICE,2502
69
+ singlestoredb/mysql/tests/test_nextset.py,sha256=CdiCOeZI5a_pdnjMmnQaJLCqUoXeugFj0IhOkJ_LLTA,2725
70
+ singlestoredb/mysql/tests/test_optionfile.py,sha256=eb2WaNzKKu7TjpRmWBAgjv8yXJptyGH964H1Uhuy-U4,585
71
+ singlestoredb/mysql/tests/thirdparty/__init__.py,sha256=M1hysF-gCD33Q8msVNoTDYJ8Lq3xyOlxXe3dUwPySjg,117
72
+ singlestoredb/mysql/tests/thirdparty/test_MySQLdb/__init__.py,sha256=bG2vIeDuGH568xEQjM_YTvnJNgOLB9ofLmwfrBmicQc,307
73
+ singlestoredb/mysql/tests/thirdparty/test_MySQLdb/capabilities.py,sha256=AgEdvx7Njz_Y7KDMeQPMYI7y4nJRKblocVrC0VxVZZE,10171
74
+ singlestoredb/mysql/tests/thirdparty/test_MySQLdb/dbapi20.py,sha256=E5_jnyZEZ7_mZw_P4EAzxMSSgvU8DXpp1kTM_kubdbs,31414
75
+ singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py,sha256=szE4Zodgf7YwhkMBOrCvUwhTWppVtaodsqlV-vJ7fmY,3090
76
+ singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_dbapi20.py,sha256=t_OzqsVnj_ReBbmY_wx51ZcWbLz9nASZ0hno-9YeiyQ,8022
77
+ singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py,sha256=pl0bvuZo_nzAlYOINxRiR-Zi9khz0W2Pc7vP-K3sQYQ,2819
78
+ singlestoredb/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
+ singlestoredb/tests/empty.sql,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
+ singlestoredb/tests/local_infile.csv,sha256=sBtqjvfkS9aoOVx8nMXYgYv4rDuT4OuYhqUhNRu0O68,42
81
+ singlestoredb/tests/test.sql,sha256=zuckJJgKI8cjIkM03WC67hCTk75TSJYVNA3x9VLQWH4,9954
82
+ singlestoredb/tests/test2.sql,sha256=D4U2GSlOVeo39U8-RMM4YziJzYFfi4Ztm2YXJVJVAS8,37
83
+ singlestoredb/tests/test_basics.py,sha256=rUfUGZ54xybvgp11XYWdqnUYMKa6VckB3XkX9LFnxRw,44180
84
+ singlestoredb/tests/test_config.py,sha256=63lyIQ2KrvGE6C9403B_4Mc90mX4tp42ys5Bih2sXrE,11184
85
+ singlestoredb/tests/test_connection.py,sha256=RiE_NATLYPiMR5jWaBlcP5YddwitS6dzOHOVVOVXCSI,50741
86
+ singlestoredb/tests/test_dbapi.py,sha256=IKq5Hcwx8WikASP8_AB5fo3TXv7ryWPCVGonoly00gI,652
87
+ singlestoredb/tests/test_exceptions.py,sha256=tfr_8X2w1UmG4nkSBzWGB0C7ehrf1GAVgj6_ODaG-TM,1131
88
+ singlestoredb/tests/test_ext_func.py,sha256=Q-ZOl7fn6XfiHpHgxLvaBi7KSVzIehbS-cthitXpe8g,37347
89
+ singlestoredb/tests/test_ext_func_data.py,sha256=9Zb0Z1v-Yr0uOc97NJwPWuvJB49pLhzWKZtZWt-e7-Y,47693
90
+ singlestoredb/tests/test_fusion.py,sha256=UPaxXt5YNa3GS44l4oZfmUcq89YgN7EWWIbW_oCkYao,15100
91
+ singlestoredb/tests/test_http.py,sha256=RXasTqBWRn__omj0eLFTJYIbZjd0PPdIV2d4Cqz0MC8,8580
92
+ singlestoredb/tests/test_management.py,sha256=P5I50_gt1VE5ja4CNVo0j10fmwAqE57psxCvI_RWRFI,28223
93
+ singlestoredb/tests/test_plugin.py,sha256=qpO9wmWc62VaijN1sJ97YSYIX7I7Y5C6sY-WzwrutDQ,812
94
+ singlestoredb/tests/test_results.py,sha256=wg93sujwt-R9_eJCgSCElgAZhLDkIiAo3qPkPydOv78,6582
95
+ singlestoredb/tests/test_types.py,sha256=jqoAaSjhbgwB3vt0KsTcl7XBWoMMIa0mPFKhEi5bBjo,4500
96
+ singlestoredb/tests/test_udf.py,sha256=2Ml6VMTKIfstB-L31uX-zftwPsT5C64M29WZ6iuKdjI,28075
97
+ singlestoredb/tests/test_xdict.py,sha256=fqHspoi39nbX3fIDVkkRXcd5H50xdOsSvK0bxAMQnaE,10408
98
+ singlestoredb/tests/utils.py,sha256=76eNdYFVnsw6S3J_RaGgGQ87Rlm8pxwyYaFYXnvAEvk,4673
99
+ singlestoredb/tests/ext_funcs/__init__.py,sha256=qZLnDI_Ck0tguVi-K-BKXDHAcC0jui3dsm93Djj4x08,9290
100
+ singlestoredb/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
+ singlestoredb/utils/config.py,sha256=m3Xn6hsbdKyLufSnbokhFJ9Vfaz9Qpkj1IEnIiH9oJQ,24503
102
+ singlestoredb/utils/convert_rows.py,sha256=A6up7a8Bq-eV2BXdGCotQviqp1Q7XdJ2MA9339hLYVQ,1816
103
+ singlestoredb/utils/debug.py,sha256=0JiLA37u_9CKiDGiN9BK_PtFMUku3vIcNjERWaTNRSU,349
104
+ singlestoredb/utils/mogrify.py,sha256=-a56IF70U6CkfadeaZgfjRSVsAD3PuqRrzPpjZlgbwY,4050
105
+ singlestoredb/utils/results.py,sha256=cqFK4-0CBSDcT-R1ixKIWN5_sCn9s9SoEO6Gllj8mCI,5204
106
+ singlestoredb/utils/xdict.py,sha256=S9HKgrPrnu_6b7iOwa2KrW8CmU1Uqx0BWdEyogFzWbE,12896
107
+ singlestoredb-1.0.4.dist-info/LICENSE,sha256=Mlq78idURT-9G026aMYswwwnnrLcgzTLuXeAs5hjDLM,11341
108
+ singlestoredb-1.0.4.dist-info/METADATA,sha256=915Z6b0vs9PUD13g_QPouiz13qx9kfjqTpTuSnZdnow,5515
109
+ singlestoredb-1.0.4.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
110
+ singlestoredb-1.0.4.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
111
+ singlestoredb-1.0.4.dist-info/top_level.txt,sha256=eet8bVPNRqiGeY0PrO5ERH2UpamwlrKHEQCffz4dOh8,14
112
+ singlestoredb-1.0.4.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.37.1)
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1,2 @@
1
+ [pytest11]
2
+ singlestoredb = singlestoredb.pytest