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.
- singlestoredb/__init__.py +33 -1
- singlestoredb/alchemy/__init__.py +90 -0
- singlestoredb/auth.py +5 -1
- singlestoredb/config.py +116 -14
- singlestoredb/connection.py +483 -516
- singlestoredb/converters.py +238 -135
- singlestoredb/exceptions.py +30 -2
- singlestoredb/functions/__init__.py +1 -0
- singlestoredb/functions/decorator.py +142 -0
- singlestoredb/functions/dtypes.py +1639 -0
- singlestoredb/functions/ext/__init__.py +2 -0
- singlestoredb/functions/ext/arrow.py +375 -0
- singlestoredb/functions/ext/asgi.py +661 -0
- singlestoredb/functions/ext/json.py +427 -0
- singlestoredb/functions/ext/mmap.py +306 -0
- singlestoredb/functions/ext/rowdat_1.py +744 -0
- singlestoredb/functions/signature.py +673 -0
- singlestoredb/fusion/__init__.py +11 -0
- singlestoredb/fusion/graphql.py +213 -0
- singlestoredb/fusion/handler.py +621 -0
- singlestoredb/fusion/handlers/stage.py +257 -0
- singlestoredb/fusion/handlers/utils.py +162 -0
- singlestoredb/fusion/handlers/workspace.py +412 -0
- singlestoredb/fusion/registry.py +164 -0
- singlestoredb/fusion/result.py +399 -0
- singlestoredb/http/__init__.py +27 -0
- singlestoredb/{http.py → http/connection.py} +555 -154
- singlestoredb/management/__init__.py +3 -0
- singlestoredb/management/billing_usage.py +148 -0
- singlestoredb/management/cluster.py +14 -6
- singlestoredb/management/manager.py +100 -38
- singlestoredb/management/organization.py +188 -0
- singlestoredb/management/region.py +5 -5
- singlestoredb/management/utils.py +281 -2
- singlestoredb/management/workspace.py +1344 -49
- singlestoredb/{clients/pymysqlsv → mysql}/__init__.py +16 -21
- singlestoredb/{clients/pymysqlsv → mysql}/_auth.py +39 -8
- singlestoredb/{clients/pymysqlsv → mysql}/charset.py +26 -23
- singlestoredb/{clients/pymysqlsv/connections.py → mysql/connection.py} +532 -165
- singlestoredb/{clients/pymysqlsv → mysql}/constants/CLIENT.py +0 -1
- singlestoredb/{clients/pymysqlsv → mysql}/constants/COMMAND.py +0 -1
- singlestoredb/{clients/pymysqlsv → mysql}/constants/CR.py +0 -2
- singlestoredb/{clients/pymysqlsv → mysql}/constants/ER.py +0 -1
- singlestoredb/{clients/pymysqlsv → mysql}/constants/FIELD_TYPE.py +1 -1
- singlestoredb/{clients/pymysqlsv → mysql}/constants/FLAG.py +0 -1
- singlestoredb/{clients/pymysqlsv → mysql}/constants/SERVER_STATUS.py +0 -1
- singlestoredb/mysql/converters.py +271 -0
- singlestoredb/{clients/pymysqlsv → mysql}/cursors.py +228 -112
- singlestoredb/mysql/err.py +92 -0
- singlestoredb/{clients/pymysqlsv → mysql}/optionfile.py +5 -4
- singlestoredb/{clients/pymysqlsv → mysql}/protocol.py +49 -20
- singlestoredb/mysql/tests/__init__.py +19 -0
- singlestoredb/{clients/pymysqlsv → mysql}/tests/base.py +32 -12
- singlestoredb/mysql/tests/conftest.py +37 -0
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_DictCursor.py +11 -7
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_SSCursor.py +17 -12
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_basic.py +32 -24
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_connection.py +130 -119
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_converters.py +9 -7
- singlestoredb/mysql/tests/test_cursor.py +141 -0
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_err.py +3 -2
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_issues.py +35 -27
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_load_local.py +13 -11
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_nextset.py +7 -3
- singlestoredb/{clients/pymysqlsv → mysql}/tests/test_optionfile.py +2 -1
- singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/__init__.py +1 -1
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/__init__.py +9 -0
- singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/test_MySQLdb/capabilities.py +19 -17
- singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/test_MySQLdb/dbapi20.py +31 -22
- singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py +3 -4
- singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/test_MySQLdb/test_MySQLdb_dbapi20.py +24 -20
- singlestoredb/{clients/pymysqlsv → mysql}/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py +4 -4
- singlestoredb/{clients/pymysqlsv → mysql}/times.py +3 -4
- singlestoredb/pytest.py +283 -0
- singlestoredb/tests/empty.sql +0 -0
- singlestoredb/tests/ext_funcs/__init__.py +385 -0
- singlestoredb/tests/test.sql +210 -0
- singlestoredb/tests/test2.sql +1 -0
- singlestoredb/tests/test_basics.py +482 -115
- singlestoredb/tests/test_config.py +13 -13
- singlestoredb/tests/test_connection.py +241 -305
- singlestoredb/tests/test_dbapi.py +27 -0
- singlestoredb/tests/test_ext_func.py +1193 -0
- singlestoredb/tests/test_ext_func_data.py +1101 -0
- singlestoredb/tests/test_fusion.py +465 -0
- singlestoredb/tests/test_http.py +32 -26
- singlestoredb/tests/test_management.py +588 -8
- singlestoredb/tests/test_plugin.py +33 -0
- singlestoredb/tests/test_results.py +11 -12
- singlestoredb/tests/test_udf.py +687 -0
- singlestoredb/tests/utils.py +3 -2
- singlestoredb/utils/config.py +58 -0
- singlestoredb/utils/debug.py +13 -0
- singlestoredb/utils/mogrify.py +151 -0
- singlestoredb/utils/results.py +4 -1
- singlestoredb-1.0.4.dist-info/METADATA +139 -0
- singlestoredb-1.0.4.dist-info/RECORD +112 -0
- {singlestoredb-0.4.0.dist-info → singlestoredb-1.0.4.dist-info}/WHEEL +1 -1
- singlestoredb-1.0.4.dist-info/entry_points.txt +2 -0
- singlestoredb/clients/pymysqlsv/converters.py +0 -365
- singlestoredb/clients/pymysqlsv/err.py +0 -144
- singlestoredb/clients/pymysqlsv/tests/__init__.py +0 -19
- singlestoredb/clients/pymysqlsv/tests/test_cursor.py +0 -133
- singlestoredb/clients/pymysqlsv/tests/thirdparty/test_MySQLdb/__init__.py +0 -9
- singlestoredb/drivers/__init__.py +0 -45
- singlestoredb/drivers/base.py +0 -198
- singlestoredb/drivers/cymysql.py +0 -38
- singlestoredb/drivers/http.py +0 -47
- singlestoredb/drivers/mariadb.py +0 -40
- singlestoredb/drivers/mysqlconnector.py +0 -49
- singlestoredb/drivers/mysqldb.py +0 -60
- singlestoredb/drivers/pymysql.py +0 -37
- singlestoredb/drivers/pymysqlsv.py +0 -35
- singlestoredb/drivers/pyodbc.py +0 -65
- singlestoredb-0.4.0.dist-info/METADATA +0 -111
- singlestoredb-0.4.0.dist-info/RECORD +0 -86
- /singlestoredb/{clients → fusion/handlers}/__init__.py +0 -0
- /singlestoredb/{clients/pymysqlsv → mysql}/constants/__init__.py +0 -0
- {singlestoredb-0.4.0.dist-info → singlestoredb-1.0.4.dist-info}/LICENSE +0 -0
- {singlestoredb-0.4.0.dist-info → singlestoredb-1.0.4.dist-info}/top_level.txt +0 -0
|
@@ -5,22 +5,25 @@ import time
|
|
|
5
5
|
|
|
6
6
|
import pytest
|
|
7
7
|
|
|
8
|
-
import singlestoredb.
|
|
9
|
-
import singlestoredb.
|
|
10
|
-
from singlestoredb.
|
|
11
|
-
from singlestoredb.clients.pymysqlsv.tests import base
|
|
8
|
+
import singlestoredb.mysql as sv
|
|
9
|
+
import singlestoredb.mysql.cursors as cursors
|
|
10
|
+
from singlestoredb.mysql.tests import base
|
|
12
11
|
|
|
13
12
|
|
|
14
13
|
__all__ = ['TestConversion', 'TestCursor', 'TestBulkInserts']
|
|
15
14
|
|
|
16
15
|
|
|
17
16
|
class TestConversion(base.PyMySQLTestCase):
|
|
17
|
+
|
|
18
18
|
def test_datatypes(self):
|
|
19
|
-
"""
|
|
19
|
+
"""Test every data type."""
|
|
20
20
|
conn = self.connect()
|
|
21
21
|
c = conn.cursor()
|
|
22
22
|
c.execute(
|
|
23
|
-
'create table test_datatypes (b bit, i int, l bigint, f real,
|
|
23
|
+
'create table test_datatypes (b bit, i int, l bigint, f real, '
|
|
24
|
+
' s varchar(32), u varchar(32), bb blob, '
|
|
25
|
+
' d date, dt datetime, ts timestamp, '
|
|
26
|
+
' td time, t time, st datetime)',
|
|
24
27
|
)
|
|
25
28
|
try:
|
|
26
29
|
# insert values
|
|
@@ -40,7 +43,8 @@ class TestConversion(base.PyMySQLTestCase):
|
|
|
40
43
|
time.localtime(),
|
|
41
44
|
)
|
|
42
45
|
c.execute(
|
|
43
|
-
'insert into test_datatypes (b,i,l,f,s,u,bb,d,dt,td,t,st)
|
|
46
|
+
'insert into test_datatypes (b,i,l,f,s,u,bb,d,dt,td,t,st) '
|
|
47
|
+
' values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)',
|
|
44
48
|
v,
|
|
45
49
|
)
|
|
46
50
|
c.execute('select b,i,l,f,s,u,bb,d,dt,td,t,st from test_datatypes')
|
|
@@ -56,7 +60,8 @@ class TestConversion(base.PyMySQLTestCase):
|
|
|
56
60
|
|
|
57
61
|
# check nulls
|
|
58
62
|
c.execute(
|
|
59
|
-
'insert into test_datatypes (b,i,l,f,s,u,bb,d,dt,td,t,st)
|
|
63
|
+
'insert into test_datatypes (b,i,l,f,s,u,bb,d,dt,td,t,st) '
|
|
64
|
+
' values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)',
|
|
60
65
|
[None] * 12,
|
|
61
66
|
)
|
|
62
67
|
c.execute('select b,i,l,f,s,u,bb,d,dt,td,t,st from test_datatypes')
|
|
@@ -75,14 +80,15 @@ class TestConversion(base.PyMySQLTestCase):
|
|
|
75
80
|
'select l from test_datatypes where i in %s order by i', (seq,),
|
|
76
81
|
)
|
|
77
82
|
r = c.fetchall()
|
|
78
|
-
|
|
83
|
+
# NOTE: C extension returns a list, not a tuple
|
|
84
|
+
self.assertEqual(((4,), (8,)), tuple(r))
|
|
79
85
|
c.execute('delete from test_datatypes')
|
|
80
86
|
|
|
81
87
|
finally:
|
|
82
88
|
c.execute('drop table test_datatypes')
|
|
83
89
|
|
|
84
90
|
def test_dict(self):
|
|
85
|
-
"""
|
|
91
|
+
"""Test dict escaping."""
|
|
86
92
|
conn = self.connect()
|
|
87
93
|
c = conn.cursor()
|
|
88
94
|
c.execute('create table test_dict (a integer, b integer, c integer)')
|
|
@@ -121,7 +127,7 @@ class TestConversion(base.PyMySQLTestCase):
|
|
|
121
127
|
c.execute('drop table test_dict')
|
|
122
128
|
|
|
123
129
|
def test_binary(self):
|
|
124
|
-
"""
|
|
130
|
+
"""Test binary data."""
|
|
125
131
|
data = bytes(bytearray(range(255)))
|
|
126
132
|
conn = self.connect()
|
|
127
133
|
self.safe_create_table(
|
|
@@ -134,7 +140,7 @@ class TestConversion(base.PyMySQLTestCase):
|
|
|
134
140
|
self.assertEqual(data, c.fetchone()[0])
|
|
135
141
|
|
|
136
142
|
def test_blob(self):
|
|
137
|
-
"""
|
|
143
|
+
"""Test blob data."""
|
|
138
144
|
data = bytes(bytearray(range(256)) * 4)
|
|
139
145
|
conn = self.connect()
|
|
140
146
|
self.safe_create_table(conn, 'test_blob', 'create table test_blob (b blob)')
|
|
@@ -145,7 +151,7 @@ class TestConversion(base.PyMySQLTestCase):
|
|
|
145
151
|
self.assertEqual(data, c.fetchone()[0])
|
|
146
152
|
|
|
147
153
|
def test_untyped(self):
|
|
148
|
-
"""
|
|
154
|
+
"""Test conversion of null, empty string."""
|
|
149
155
|
conn = self.connect()
|
|
150
156
|
c = conn.cursor()
|
|
151
157
|
c.execute("select null,''")
|
|
@@ -154,11 +160,13 @@ class TestConversion(base.PyMySQLTestCase):
|
|
|
154
160
|
self.assertEqual(('', None), c.fetchone())
|
|
155
161
|
|
|
156
162
|
def test_timedelta(self):
|
|
157
|
-
"""
|
|
163
|
+
"""Test timedelta conversion."""
|
|
158
164
|
conn = self.connect()
|
|
159
165
|
c = conn.cursor()
|
|
160
166
|
c.execute(
|
|
161
|
-
"select time('12:30'), time('23:12:59'), time('23:12:59.05100'),
|
|
167
|
+
"select time('12:30'), time('23:12:59'), time('23:12:59.05100'), "
|
|
168
|
+
" time('-12:30'), time('-23:12:59'), time('-23:12:59.05100'), "
|
|
169
|
+
" time('-00:30')",
|
|
162
170
|
)
|
|
163
171
|
self.assertEqual(
|
|
164
172
|
(
|
|
@@ -174,7 +182,7 @@ class TestConversion(base.PyMySQLTestCase):
|
|
|
174
182
|
)
|
|
175
183
|
|
|
176
184
|
def test_datetime_microseconds(self):
|
|
177
|
-
"""
|
|
185
|
+
"""Test datetime conversion w microseconds."""
|
|
178
186
|
|
|
179
187
|
conn = self.connect()
|
|
180
188
|
c = conn.cursor()
|
|
@@ -243,7 +251,7 @@ class TestCursor(base.PyMySQLTestCase):
|
|
|
243
251
|
# self.assertEqual(r, c.description)
|
|
244
252
|
|
|
245
253
|
def test_fetch_no_result(self):
|
|
246
|
-
"""
|
|
254
|
+
"""Test a fetchone() with no rows."""
|
|
247
255
|
conn = self.connect()
|
|
248
256
|
c = conn.cursor()
|
|
249
257
|
c.execute('create table test_nr (b varchar(32))')
|
|
@@ -255,7 +263,7 @@ class TestCursor(base.PyMySQLTestCase):
|
|
|
255
263
|
c.execute('drop table test_nr')
|
|
256
264
|
|
|
257
265
|
def test_aggregates(self):
|
|
258
|
-
"""
|
|
266
|
+
"""Test aggregate functions."""
|
|
259
267
|
conn = self.connect()
|
|
260
268
|
c = conn.cursor()
|
|
261
269
|
try:
|
|
@@ -269,7 +277,7 @@ class TestCursor(base.PyMySQLTestCase):
|
|
|
269
277
|
c.execute('drop table test_aggregates')
|
|
270
278
|
|
|
271
279
|
def test_single_tuple(self):
|
|
272
|
-
"""
|
|
280
|
+
"""Test a single tuple."""
|
|
273
281
|
conn = self.connect()
|
|
274
282
|
c = conn.cursor()
|
|
275
283
|
self.safe_create_table(
|
|
@@ -306,12 +314,12 @@ create table test_json (
|
|
|
306
314
|
cur.execute('INSERT INTO test_json (id, `json`) values (42, %s)', (json_str,))
|
|
307
315
|
cur.execute('SELECT `json` from `test_json` WHERE `id`=42')
|
|
308
316
|
res = cur.fetchone()[0]
|
|
309
|
-
self.assertEqual(
|
|
317
|
+
self.assertEqual(res, json.loads(json_str))
|
|
310
318
|
|
|
311
319
|
# cur.execute("SELECT CAST(%s AS JSON) AS x", (json_str,))
|
|
312
320
|
cur.execute('SELECT %s :> JSON AS x', (json_str,))
|
|
313
321
|
res = cur.fetchone()[0]
|
|
314
|
-
self.assertEqual(
|
|
322
|
+
self.assertEqual(res, json.loads(json_str))
|
|
315
323
|
|
|
316
324
|
|
|
317
325
|
class TestBulkInserts(base.PyMySQLTestCase):
|
|
@@ -320,8 +328,8 @@ class TestBulkInserts(base.PyMySQLTestCase):
|
|
|
320
328
|
|
|
321
329
|
def setUp(self):
|
|
322
330
|
super(TestBulkInserts, self).setUp()
|
|
323
|
-
self.conn = conn = self.connect()
|
|
324
|
-
c = conn.cursor(
|
|
331
|
+
self.conn = conn = self.connect(cursorclass=self.cursor_type)
|
|
332
|
+
c = conn.cursor() # noqa: F841
|
|
325
333
|
|
|
326
334
|
# create a table ane some data to query
|
|
327
335
|
self.safe_create_table(
|
|
@@ -409,7 +417,7 @@ values (0,
|
|
|
409
417
|
self._verify_records(data)
|
|
410
418
|
|
|
411
419
|
def test_issue_288(self):
|
|
412
|
-
"""
|
|
420
|
+
"""Executemany should work with "insert ... on update"."""
|
|
413
421
|
conn = self.connect()
|
|
414
422
|
cursor = conn.cursor()
|
|
415
423
|
data = [(0, 'bob', 21, 123), (1, 'jim', 56, 45), (2, 'fred', 100, 180)]
|