singlestoredb 1.16.1__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.
- singlestoredb/__init__.py +75 -0
- singlestoredb/ai/__init__.py +2 -0
- singlestoredb/ai/chat.py +139 -0
- singlestoredb/ai/embeddings.py +128 -0
- singlestoredb/alchemy/__init__.py +90 -0
- singlestoredb/apps/__init__.py +3 -0
- singlestoredb/apps/_cloud_functions.py +90 -0
- singlestoredb/apps/_config.py +72 -0
- singlestoredb/apps/_connection_info.py +18 -0
- singlestoredb/apps/_dashboards.py +47 -0
- singlestoredb/apps/_process.py +32 -0
- singlestoredb/apps/_python_udfs.py +100 -0
- singlestoredb/apps/_stdout_supress.py +30 -0
- singlestoredb/apps/_uvicorn_util.py +36 -0
- singlestoredb/auth.py +245 -0
- singlestoredb/config.py +484 -0
- singlestoredb/connection.py +1487 -0
- singlestoredb/converters.py +950 -0
- singlestoredb/docstring/__init__.py +33 -0
- singlestoredb/docstring/attrdoc.py +126 -0
- singlestoredb/docstring/common.py +230 -0
- singlestoredb/docstring/epydoc.py +267 -0
- singlestoredb/docstring/google.py +412 -0
- singlestoredb/docstring/numpydoc.py +562 -0
- singlestoredb/docstring/parser.py +100 -0
- singlestoredb/docstring/py.typed +1 -0
- singlestoredb/docstring/rest.py +256 -0
- singlestoredb/docstring/tests/__init__.py +1 -0
- singlestoredb/docstring/tests/_pydoctor.py +21 -0
- singlestoredb/docstring/tests/test_epydoc.py +729 -0
- singlestoredb/docstring/tests/test_google.py +1007 -0
- singlestoredb/docstring/tests/test_numpydoc.py +1100 -0
- singlestoredb/docstring/tests/test_parse_from_object.py +109 -0
- singlestoredb/docstring/tests/test_parser.py +248 -0
- singlestoredb/docstring/tests/test_rest.py +547 -0
- singlestoredb/docstring/tests/test_util.py +70 -0
- singlestoredb/docstring/util.py +141 -0
- singlestoredb/exceptions.py +120 -0
- singlestoredb/functions/__init__.py +16 -0
- singlestoredb/functions/decorator.py +201 -0
- singlestoredb/functions/dtypes.py +1793 -0
- singlestoredb/functions/ext/__init__.py +1 -0
- singlestoredb/functions/ext/arrow.py +375 -0
- singlestoredb/functions/ext/asgi.py +2133 -0
- singlestoredb/functions/ext/json.py +420 -0
- singlestoredb/functions/ext/mmap.py +413 -0
- singlestoredb/functions/ext/rowdat_1.py +724 -0
- singlestoredb/functions/ext/timer.py +89 -0
- singlestoredb/functions/ext/utils.py +218 -0
- singlestoredb/functions/signature.py +1578 -0
- singlestoredb/functions/typing/__init__.py +41 -0
- singlestoredb/functions/typing/numpy.py +20 -0
- singlestoredb/functions/typing/pandas.py +2 -0
- singlestoredb/functions/typing/polars.py +2 -0
- singlestoredb/functions/typing/pyarrow.py +2 -0
- singlestoredb/functions/utils.py +421 -0
- singlestoredb/fusion/__init__.py +11 -0
- singlestoredb/fusion/graphql.py +213 -0
- singlestoredb/fusion/handler.py +916 -0
- singlestoredb/fusion/handlers/__init__.py +0 -0
- singlestoredb/fusion/handlers/export.py +525 -0
- singlestoredb/fusion/handlers/files.py +690 -0
- singlestoredb/fusion/handlers/job.py +660 -0
- singlestoredb/fusion/handlers/models.py +250 -0
- singlestoredb/fusion/handlers/stage.py +502 -0
- singlestoredb/fusion/handlers/utils.py +324 -0
- singlestoredb/fusion/handlers/workspace.py +956 -0
- singlestoredb/fusion/registry.py +249 -0
- singlestoredb/fusion/result.py +399 -0
- singlestoredb/http/__init__.py +27 -0
- singlestoredb/http/connection.py +1267 -0
- singlestoredb/magics/__init__.py +34 -0
- singlestoredb/magics/run_personal.py +137 -0
- singlestoredb/magics/run_shared.py +134 -0
- singlestoredb/management/__init__.py +9 -0
- singlestoredb/management/billing_usage.py +148 -0
- singlestoredb/management/cluster.py +462 -0
- singlestoredb/management/export.py +295 -0
- singlestoredb/management/files.py +1102 -0
- singlestoredb/management/inference_api.py +105 -0
- singlestoredb/management/job.py +887 -0
- singlestoredb/management/manager.py +373 -0
- singlestoredb/management/organization.py +226 -0
- singlestoredb/management/region.py +169 -0
- singlestoredb/management/utils.py +423 -0
- singlestoredb/management/workspace.py +1927 -0
- singlestoredb/mysql/__init__.py +177 -0
- singlestoredb/mysql/_auth.py +298 -0
- singlestoredb/mysql/charset.py +214 -0
- singlestoredb/mysql/connection.py +2032 -0
- singlestoredb/mysql/constants/CLIENT.py +38 -0
- singlestoredb/mysql/constants/COMMAND.py +32 -0
- singlestoredb/mysql/constants/CR.py +78 -0
- singlestoredb/mysql/constants/ER.py +474 -0
- singlestoredb/mysql/constants/EXTENDED_TYPE.py +3 -0
- singlestoredb/mysql/constants/FIELD_TYPE.py +48 -0
- singlestoredb/mysql/constants/FLAG.py +15 -0
- singlestoredb/mysql/constants/SERVER_STATUS.py +10 -0
- singlestoredb/mysql/constants/VECTOR_TYPE.py +6 -0
- singlestoredb/mysql/constants/__init__.py +0 -0
- singlestoredb/mysql/converters.py +271 -0
- singlestoredb/mysql/cursors.py +896 -0
- singlestoredb/mysql/err.py +92 -0
- singlestoredb/mysql/optionfile.py +20 -0
- singlestoredb/mysql/protocol.py +450 -0
- singlestoredb/mysql/tests/__init__.py +19 -0
- singlestoredb/mysql/tests/base.py +126 -0
- singlestoredb/mysql/tests/conftest.py +37 -0
- singlestoredb/mysql/tests/test_DictCursor.py +132 -0
- singlestoredb/mysql/tests/test_SSCursor.py +141 -0
- singlestoredb/mysql/tests/test_basic.py +452 -0
- singlestoredb/mysql/tests/test_connection.py +851 -0
- singlestoredb/mysql/tests/test_converters.py +58 -0
- singlestoredb/mysql/tests/test_cursor.py +141 -0
- singlestoredb/mysql/tests/test_err.py +16 -0
- singlestoredb/mysql/tests/test_issues.py +514 -0
- singlestoredb/mysql/tests/test_load_local.py +75 -0
- singlestoredb/mysql/tests/test_nextset.py +88 -0
- singlestoredb/mysql/tests/test_optionfile.py +27 -0
- singlestoredb/mysql/tests/thirdparty/__init__.py +6 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/__init__.py +9 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/capabilities.py +323 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/dbapi20.py +865 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py +110 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_dbapi20.py +224 -0
- singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py +101 -0
- singlestoredb/mysql/times.py +23 -0
- singlestoredb/notebook/__init__.py +16 -0
- singlestoredb/notebook/_objects.py +213 -0
- singlestoredb/notebook/_portal.py +352 -0
- singlestoredb/py.typed +0 -0
- singlestoredb/pytest.py +352 -0
- singlestoredb/server/__init__.py +0 -0
- singlestoredb/server/docker.py +452 -0
- singlestoredb/server/free_tier.py +267 -0
- singlestoredb/tests/__init__.py +0 -0
- singlestoredb/tests/alltypes.sql +307 -0
- singlestoredb/tests/alltypes_no_nulls.sql +208 -0
- singlestoredb/tests/empty.sql +0 -0
- singlestoredb/tests/ext_funcs/__init__.py +702 -0
- singlestoredb/tests/local_infile.csv +3 -0
- singlestoredb/tests/test.ipynb +18 -0
- singlestoredb/tests/test.sql +680 -0
- singlestoredb/tests/test2.ipynb +18 -0
- singlestoredb/tests/test2.sql +1 -0
- singlestoredb/tests/test_basics.py +1332 -0
- singlestoredb/tests/test_config.py +318 -0
- singlestoredb/tests/test_connection.py +3103 -0
- singlestoredb/tests/test_dbapi.py +27 -0
- singlestoredb/tests/test_exceptions.py +45 -0
- singlestoredb/tests/test_ext_func.py +1472 -0
- singlestoredb/tests/test_ext_func_data.py +1101 -0
- singlestoredb/tests/test_fusion.py +1527 -0
- singlestoredb/tests/test_http.py +288 -0
- singlestoredb/tests/test_management.py +1599 -0
- singlestoredb/tests/test_plugin.py +33 -0
- singlestoredb/tests/test_results.py +171 -0
- singlestoredb/tests/test_types.py +132 -0
- singlestoredb/tests/test_udf.py +737 -0
- singlestoredb/tests/test_udf_returns.py +459 -0
- singlestoredb/tests/test_vectorstore.py +51 -0
- singlestoredb/tests/test_xdict.py +333 -0
- singlestoredb/tests/utils.py +141 -0
- singlestoredb/types.py +373 -0
- singlestoredb/utils/__init__.py +0 -0
- singlestoredb/utils/config.py +950 -0
- singlestoredb/utils/convert_rows.py +69 -0
- singlestoredb/utils/debug.py +13 -0
- singlestoredb/utils/dtypes.py +205 -0
- singlestoredb/utils/events.py +65 -0
- singlestoredb/utils/mogrify.py +151 -0
- singlestoredb/utils/results.py +585 -0
- singlestoredb/utils/xdict.py +425 -0
- singlestoredb/vectorstore.py +192 -0
- singlestoredb/warnings.py +5 -0
- singlestoredb-1.16.1.dist-info/METADATA +165 -0
- singlestoredb-1.16.1.dist-info/RECORD +183 -0
- singlestoredb-1.16.1.dist-info/WHEEL +5 -0
- singlestoredb-1.16.1.dist-info/entry_points.txt +2 -0
- singlestoredb-1.16.1.dist-info/licenses/LICENSE +201 -0
- singlestoredb-1.16.1.dist-info/top_level.txt +3 -0
- sqlx/__init__.py +4 -0
- sqlx/magic.py +113 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
import datetime
|
|
3
|
+
from unittest import TestCase
|
|
4
|
+
|
|
5
|
+
from singlestoredb import converters
|
|
6
|
+
from singlestoredb.mysql.converters import escape_string
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
__all__ = ['TestConverter']
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class TestConverter(TestCase):
|
|
13
|
+
|
|
14
|
+
def test_escape_string(self):
|
|
15
|
+
self.assertEqual(escape_string('foo\nbar'), 'foo\\nbar')
|
|
16
|
+
|
|
17
|
+
def test_convert_datetime(self):
|
|
18
|
+
expected = datetime.datetime(2007, 2, 24, 23, 6, 20)
|
|
19
|
+
dt = converters.datetime_or_none('2007-02-24 23:06:20')
|
|
20
|
+
self.assertEqual(dt, expected)
|
|
21
|
+
|
|
22
|
+
def test_convert_datetime_with_fsp(self):
|
|
23
|
+
expected = datetime.datetime(2007, 2, 24, 23, 6, 20, 511581)
|
|
24
|
+
dt = converters.datetime_or_none('2007-02-24 23:06:20.511581')
|
|
25
|
+
self.assertEqual(dt, expected)
|
|
26
|
+
|
|
27
|
+
def _test_convert_timedelta(self, with_negate=False, with_fsp=False):
|
|
28
|
+
d = {'hours': 789, 'minutes': 12, 'seconds': 34}
|
|
29
|
+
s = '%(hours)s:%(minutes)s:%(seconds)s' % d
|
|
30
|
+
if with_fsp:
|
|
31
|
+
d['microseconds'] = 511581
|
|
32
|
+
s += '.%(microseconds)s' % d
|
|
33
|
+
|
|
34
|
+
expected = datetime.timedelta(**d)
|
|
35
|
+
if with_negate:
|
|
36
|
+
expected = -expected
|
|
37
|
+
s = '-' + s
|
|
38
|
+
|
|
39
|
+
tdelta = converters.timedelta_or_none(s)
|
|
40
|
+
self.assertEqual(tdelta, expected)
|
|
41
|
+
|
|
42
|
+
def test_convert_timedelta(self):
|
|
43
|
+
self._test_convert_timedelta(with_negate=False, with_fsp=False)
|
|
44
|
+
self._test_convert_timedelta(with_negate=True, with_fsp=False)
|
|
45
|
+
|
|
46
|
+
def test_convert_timedelta_with_fsp(self):
|
|
47
|
+
self._test_convert_timedelta(with_negate=False, with_fsp=True)
|
|
48
|
+
self._test_convert_timedelta(with_negate=False, with_fsp=True)
|
|
49
|
+
|
|
50
|
+
def test_convert_time(self):
|
|
51
|
+
expected = datetime.time(23, 6, 20)
|
|
52
|
+
time_obj = converters.time_or_none('23:06:20')
|
|
53
|
+
self.assertEqual(time_obj, expected)
|
|
54
|
+
|
|
55
|
+
def test_convert_time_with_fsp(self):
|
|
56
|
+
expected = datetime.time(23, 6, 20, 511581)
|
|
57
|
+
time_obj = converters.time_or_none('23:06:20.511581')
|
|
58
|
+
self.assertEqual(time_obj, expected)
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
import singlestoredb.mysql as sv
|
|
3
|
+
import singlestoredb.mysql.cursors as cursors
|
|
4
|
+
from singlestoredb.mysql.tests import base
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class CursorTest(base.PyMySQLTestCase):
|
|
8
|
+
|
|
9
|
+
def setUp(self):
|
|
10
|
+
super(CursorTest, self).setUp()
|
|
11
|
+
|
|
12
|
+
conn = self.connect()
|
|
13
|
+
self.safe_create_table(
|
|
14
|
+
conn,
|
|
15
|
+
'test',
|
|
16
|
+
'create table test (data varchar(10))',
|
|
17
|
+
)
|
|
18
|
+
cursor = conn.cursor()
|
|
19
|
+
cursor.execute(
|
|
20
|
+
'insert into test (data) values '
|
|
21
|
+
"('row1'), ('row2'), ('row3'), ('row4'), ('row5')",
|
|
22
|
+
)
|
|
23
|
+
cursor.close()
|
|
24
|
+
self.test_connection = sv.connect(**self.databases[0])
|
|
25
|
+
self.addCleanup(self.test_connection.close)
|
|
26
|
+
|
|
27
|
+
def test_cleanup_rows_unbuffered(self):
|
|
28
|
+
with self.connect(cursorclass=cursors.SSCursor) as conn:
|
|
29
|
+
with self.connect(cursorclass=cursors.SSCursor) as conn:
|
|
30
|
+
cursor = conn.cursor()
|
|
31
|
+
|
|
32
|
+
cursor.execute('select * from test as t1, test as t2')
|
|
33
|
+
for counter, row in enumerate(cursor):
|
|
34
|
+
if counter > 10:
|
|
35
|
+
break
|
|
36
|
+
|
|
37
|
+
del cursor
|
|
38
|
+
|
|
39
|
+
c2 = conn.cursor()
|
|
40
|
+
|
|
41
|
+
c2.execute('select 1')
|
|
42
|
+
self.assertEqual(c2.fetchone(), (1,))
|
|
43
|
+
self.assertIsNone(c2.fetchone())
|
|
44
|
+
|
|
45
|
+
def test_cleanup_rows_buffered(self):
|
|
46
|
+
with self.connect(cursorclass=cursors.Cursor) as conn:
|
|
47
|
+
cursor = conn.cursor()
|
|
48
|
+
|
|
49
|
+
cursor.execute('select * from test as t1, test as t2')
|
|
50
|
+
for counter, row in enumerate(cursor):
|
|
51
|
+
if counter > 10:
|
|
52
|
+
break
|
|
53
|
+
|
|
54
|
+
del cursor
|
|
55
|
+
|
|
56
|
+
c2 = conn.cursor()
|
|
57
|
+
c2.execute('select 1')
|
|
58
|
+
|
|
59
|
+
self.assertEqual(c2.fetchone(), (1,))
|
|
60
|
+
self.assertIsNone(c2.fetchone())
|
|
61
|
+
|
|
62
|
+
def test_executemany(self):
|
|
63
|
+
with self.connect(cursorclass=cursors.Cursor) as conn:
|
|
64
|
+
cursor = conn.cursor()
|
|
65
|
+
|
|
66
|
+
m = cursors.RE_INSERT_VALUES.match(
|
|
67
|
+
'INSERT INTO TEST (ID, NAME) VALUES (%s, %s)',
|
|
68
|
+
)
|
|
69
|
+
self.assertIsNotNone(m, 'error parse %s')
|
|
70
|
+
self.assertEqual(
|
|
71
|
+
m.group(3), '', 'group 3 not blank, bug in RE_INSERT_VALUES?',
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
m = cursors.RE_INSERT_VALUES.match(
|
|
75
|
+
'INSERT INTO TEST (ID, NAME) VALUES (%(id)s, %(name)s)',
|
|
76
|
+
)
|
|
77
|
+
self.assertIsNotNone(m, 'error parse %(name)s')
|
|
78
|
+
self.assertEqual(
|
|
79
|
+
m.group(3), '', 'group 3 not blank, bug in RE_INSERT_VALUES?',
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
m = cursors.RE_INSERT_VALUES.match(
|
|
83
|
+
'INSERT INTO TEST (ID, NAME) VALUES (%(id_name)s, %(name)s)',
|
|
84
|
+
)
|
|
85
|
+
self.assertIsNotNone(m, 'error parse %(id_name)s')
|
|
86
|
+
self.assertEqual(
|
|
87
|
+
m.group(3), '', 'group 3 not blank, bug in RE_INSERT_VALUES?',
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
m = cursors.RE_INSERT_VALUES.match(
|
|
91
|
+
'INSERT INTO TEST (ID, NAME) VALUES (%(id_name)s, %(name)s) '
|
|
92
|
+
'ON duplicate update',
|
|
93
|
+
)
|
|
94
|
+
self.assertIsNotNone(m, 'error parse %(id_name)s')
|
|
95
|
+
self.assertEqual(
|
|
96
|
+
m.group(3),
|
|
97
|
+
' ON duplicate update',
|
|
98
|
+
'group 3 not ON duplicate update, bug in RE_INSERT_VALUES?',
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
# https://github.com/PyMySQL/PyMySQL/pull/597
|
|
102
|
+
m = cursors.RE_INSERT_VALUES.match(
|
|
103
|
+
'INSERT INTO bloup(foo, bar)VALUES(%s, %s)',
|
|
104
|
+
)
|
|
105
|
+
assert m is not None
|
|
106
|
+
|
|
107
|
+
# cursor._executed must be "insert into test (data)
|
|
108
|
+
# values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)"
|
|
109
|
+
# list args
|
|
110
|
+
data = range(10)
|
|
111
|
+
cursor.executemany('insert into test (data) values (%s)', data)
|
|
112
|
+
self.assertTrue(
|
|
113
|
+
cursor._executed.endswith(b',(7),(8),(9)'),
|
|
114
|
+
'execute many with %s not in one query',
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
# dict args
|
|
118
|
+
data_dict = [{'data': i} for i in range(10)]
|
|
119
|
+
cursor.executemany('insert into test (data) values (%(data)s)', data_dict)
|
|
120
|
+
self.assertTrue(
|
|
121
|
+
cursor._executed.endswith(b',(7),(8),(9)'),
|
|
122
|
+
'execute many with %(data)s not in one query',
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
# %% in column set
|
|
126
|
+
cursor.execute(
|
|
127
|
+
"""\
|
|
128
|
+
CREATE TABLE percent_test (
|
|
129
|
+
`A%` INTEGER,
|
|
130
|
+
`B%` INTEGER)""",
|
|
131
|
+
)
|
|
132
|
+
try:
|
|
133
|
+
q = 'INSERT INTO percent_test (`A%%`, `B%%`) VALUES (%s, %s)'
|
|
134
|
+
self.assertIsNotNone(cursors.RE_INSERT_VALUES.match(q))
|
|
135
|
+
cursor.executemany(q, [(3, 4), (5, 6)])
|
|
136
|
+
self.assertTrue(
|
|
137
|
+
cursor._executed.endswith(b'(3, 4),(5, 6)'),
|
|
138
|
+
'executemany with %% not in one query',
|
|
139
|
+
)
|
|
140
|
+
finally:
|
|
141
|
+
cursor.execute('DROP TABLE IF EXISTS percent_test')
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
import unittest
|
|
3
|
+
|
|
4
|
+
from singlestoredb.mysql import err
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
__all__ = ['TestRaiseException']
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TestRaiseException(unittest.TestCase):
|
|
11
|
+
|
|
12
|
+
def test_raise_mysql_exception(self):
|
|
13
|
+
data = b'\xff\x15\x04#28000Access denied'
|
|
14
|
+
with self.assertRaises(err.OperationalError) as cm:
|
|
15
|
+
err.raise_mysql_exception(data)
|
|
16
|
+
self.assertEqual(cm.exception.args, (1045, 'Access denied', None))
|