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.
Files changed (183) hide show
  1. singlestoredb/__init__.py +75 -0
  2. singlestoredb/ai/__init__.py +2 -0
  3. singlestoredb/ai/chat.py +139 -0
  4. singlestoredb/ai/embeddings.py +128 -0
  5. singlestoredb/alchemy/__init__.py +90 -0
  6. singlestoredb/apps/__init__.py +3 -0
  7. singlestoredb/apps/_cloud_functions.py +90 -0
  8. singlestoredb/apps/_config.py +72 -0
  9. singlestoredb/apps/_connection_info.py +18 -0
  10. singlestoredb/apps/_dashboards.py +47 -0
  11. singlestoredb/apps/_process.py +32 -0
  12. singlestoredb/apps/_python_udfs.py +100 -0
  13. singlestoredb/apps/_stdout_supress.py +30 -0
  14. singlestoredb/apps/_uvicorn_util.py +36 -0
  15. singlestoredb/auth.py +245 -0
  16. singlestoredb/config.py +484 -0
  17. singlestoredb/connection.py +1487 -0
  18. singlestoredb/converters.py +950 -0
  19. singlestoredb/docstring/__init__.py +33 -0
  20. singlestoredb/docstring/attrdoc.py +126 -0
  21. singlestoredb/docstring/common.py +230 -0
  22. singlestoredb/docstring/epydoc.py +267 -0
  23. singlestoredb/docstring/google.py +412 -0
  24. singlestoredb/docstring/numpydoc.py +562 -0
  25. singlestoredb/docstring/parser.py +100 -0
  26. singlestoredb/docstring/py.typed +1 -0
  27. singlestoredb/docstring/rest.py +256 -0
  28. singlestoredb/docstring/tests/__init__.py +1 -0
  29. singlestoredb/docstring/tests/_pydoctor.py +21 -0
  30. singlestoredb/docstring/tests/test_epydoc.py +729 -0
  31. singlestoredb/docstring/tests/test_google.py +1007 -0
  32. singlestoredb/docstring/tests/test_numpydoc.py +1100 -0
  33. singlestoredb/docstring/tests/test_parse_from_object.py +109 -0
  34. singlestoredb/docstring/tests/test_parser.py +248 -0
  35. singlestoredb/docstring/tests/test_rest.py +547 -0
  36. singlestoredb/docstring/tests/test_util.py +70 -0
  37. singlestoredb/docstring/util.py +141 -0
  38. singlestoredb/exceptions.py +120 -0
  39. singlestoredb/functions/__init__.py +16 -0
  40. singlestoredb/functions/decorator.py +201 -0
  41. singlestoredb/functions/dtypes.py +1793 -0
  42. singlestoredb/functions/ext/__init__.py +1 -0
  43. singlestoredb/functions/ext/arrow.py +375 -0
  44. singlestoredb/functions/ext/asgi.py +2133 -0
  45. singlestoredb/functions/ext/json.py +420 -0
  46. singlestoredb/functions/ext/mmap.py +413 -0
  47. singlestoredb/functions/ext/rowdat_1.py +724 -0
  48. singlestoredb/functions/ext/timer.py +89 -0
  49. singlestoredb/functions/ext/utils.py +218 -0
  50. singlestoredb/functions/signature.py +1578 -0
  51. singlestoredb/functions/typing/__init__.py +41 -0
  52. singlestoredb/functions/typing/numpy.py +20 -0
  53. singlestoredb/functions/typing/pandas.py +2 -0
  54. singlestoredb/functions/typing/polars.py +2 -0
  55. singlestoredb/functions/typing/pyarrow.py +2 -0
  56. singlestoredb/functions/utils.py +421 -0
  57. singlestoredb/fusion/__init__.py +11 -0
  58. singlestoredb/fusion/graphql.py +213 -0
  59. singlestoredb/fusion/handler.py +916 -0
  60. singlestoredb/fusion/handlers/__init__.py +0 -0
  61. singlestoredb/fusion/handlers/export.py +525 -0
  62. singlestoredb/fusion/handlers/files.py +690 -0
  63. singlestoredb/fusion/handlers/job.py +660 -0
  64. singlestoredb/fusion/handlers/models.py +250 -0
  65. singlestoredb/fusion/handlers/stage.py +502 -0
  66. singlestoredb/fusion/handlers/utils.py +324 -0
  67. singlestoredb/fusion/handlers/workspace.py +956 -0
  68. singlestoredb/fusion/registry.py +249 -0
  69. singlestoredb/fusion/result.py +399 -0
  70. singlestoredb/http/__init__.py +27 -0
  71. singlestoredb/http/connection.py +1267 -0
  72. singlestoredb/magics/__init__.py +34 -0
  73. singlestoredb/magics/run_personal.py +137 -0
  74. singlestoredb/magics/run_shared.py +134 -0
  75. singlestoredb/management/__init__.py +9 -0
  76. singlestoredb/management/billing_usage.py +148 -0
  77. singlestoredb/management/cluster.py +462 -0
  78. singlestoredb/management/export.py +295 -0
  79. singlestoredb/management/files.py +1102 -0
  80. singlestoredb/management/inference_api.py +105 -0
  81. singlestoredb/management/job.py +887 -0
  82. singlestoredb/management/manager.py +373 -0
  83. singlestoredb/management/organization.py +226 -0
  84. singlestoredb/management/region.py +169 -0
  85. singlestoredb/management/utils.py +423 -0
  86. singlestoredb/management/workspace.py +1927 -0
  87. singlestoredb/mysql/__init__.py +177 -0
  88. singlestoredb/mysql/_auth.py +298 -0
  89. singlestoredb/mysql/charset.py +214 -0
  90. singlestoredb/mysql/connection.py +2032 -0
  91. singlestoredb/mysql/constants/CLIENT.py +38 -0
  92. singlestoredb/mysql/constants/COMMAND.py +32 -0
  93. singlestoredb/mysql/constants/CR.py +78 -0
  94. singlestoredb/mysql/constants/ER.py +474 -0
  95. singlestoredb/mysql/constants/EXTENDED_TYPE.py +3 -0
  96. singlestoredb/mysql/constants/FIELD_TYPE.py +48 -0
  97. singlestoredb/mysql/constants/FLAG.py +15 -0
  98. singlestoredb/mysql/constants/SERVER_STATUS.py +10 -0
  99. singlestoredb/mysql/constants/VECTOR_TYPE.py +6 -0
  100. singlestoredb/mysql/constants/__init__.py +0 -0
  101. singlestoredb/mysql/converters.py +271 -0
  102. singlestoredb/mysql/cursors.py +896 -0
  103. singlestoredb/mysql/err.py +92 -0
  104. singlestoredb/mysql/optionfile.py +20 -0
  105. singlestoredb/mysql/protocol.py +450 -0
  106. singlestoredb/mysql/tests/__init__.py +19 -0
  107. singlestoredb/mysql/tests/base.py +126 -0
  108. singlestoredb/mysql/tests/conftest.py +37 -0
  109. singlestoredb/mysql/tests/test_DictCursor.py +132 -0
  110. singlestoredb/mysql/tests/test_SSCursor.py +141 -0
  111. singlestoredb/mysql/tests/test_basic.py +452 -0
  112. singlestoredb/mysql/tests/test_connection.py +851 -0
  113. singlestoredb/mysql/tests/test_converters.py +58 -0
  114. singlestoredb/mysql/tests/test_cursor.py +141 -0
  115. singlestoredb/mysql/tests/test_err.py +16 -0
  116. singlestoredb/mysql/tests/test_issues.py +514 -0
  117. singlestoredb/mysql/tests/test_load_local.py +75 -0
  118. singlestoredb/mysql/tests/test_nextset.py +88 -0
  119. singlestoredb/mysql/tests/test_optionfile.py +27 -0
  120. singlestoredb/mysql/tests/thirdparty/__init__.py +6 -0
  121. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/__init__.py +9 -0
  122. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/capabilities.py +323 -0
  123. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/dbapi20.py +865 -0
  124. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py +110 -0
  125. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_dbapi20.py +224 -0
  126. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py +101 -0
  127. singlestoredb/mysql/times.py +23 -0
  128. singlestoredb/notebook/__init__.py +16 -0
  129. singlestoredb/notebook/_objects.py +213 -0
  130. singlestoredb/notebook/_portal.py +352 -0
  131. singlestoredb/py.typed +0 -0
  132. singlestoredb/pytest.py +352 -0
  133. singlestoredb/server/__init__.py +0 -0
  134. singlestoredb/server/docker.py +452 -0
  135. singlestoredb/server/free_tier.py +267 -0
  136. singlestoredb/tests/__init__.py +0 -0
  137. singlestoredb/tests/alltypes.sql +307 -0
  138. singlestoredb/tests/alltypes_no_nulls.sql +208 -0
  139. singlestoredb/tests/empty.sql +0 -0
  140. singlestoredb/tests/ext_funcs/__init__.py +702 -0
  141. singlestoredb/tests/local_infile.csv +3 -0
  142. singlestoredb/tests/test.ipynb +18 -0
  143. singlestoredb/tests/test.sql +680 -0
  144. singlestoredb/tests/test2.ipynb +18 -0
  145. singlestoredb/tests/test2.sql +1 -0
  146. singlestoredb/tests/test_basics.py +1332 -0
  147. singlestoredb/tests/test_config.py +318 -0
  148. singlestoredb/tests/test_connection.py +3103 -0
  149. singlestoredb/tests/test_dbapi.py +27 -0
  150. singlestoredb/tests/test_exceptions.py +45 -0
  151. singlestoredb/tests/test_ext_func.py +1472 -0
  152. singlestoredb/tests/test_ext_func_data.py +1101 -0
  153. singlestoredb/tests/test_fusion.py +1527 -0
  154. singlestoredb/tests/test_http.py +288 -0
  155. singlestoredb/tests/test_management.py +1599 -0
  156. singlestoredb/tests/test_plugin.py +33 -0
  157. singlestoredb/tests/test_results.py +171 -0
  158. singlestoredb/tests/test_types.py +132 -0
  159. singlestoredb/tests/test_udf.py +737 -0
  160. singlestoredb/tests/test_udf_returns.py +459 -0
  161. singlestoredb/tests/test_vectorstore.py +51 -0
  162. singlestoredb/tests/test_xdict.py +333 -0
  163. singlestoredb/tests/utils.py +141 -0
  164. singlestoredb/types.py +373 -0
  165. singlestoredb/utils/__init__.py +0 -0
  166. singlestoredb/utils/config.py +950 -0
  167. singlestoredb/utils/convert_rows.py +69 -0
  168. singlestoredb/utils/debug.py +13 -0
  169. singlestoredb/utils/dtypes.py +205 -0
  170. singlestoredb/utils/events.py +65 -0
  171. singlestoredb/utils/mogrify.py +151 -0
  172. singlestoredb/utils/results.py +585 -0
  173. singlestoredb/utils/xdict.py +425 -0
  174. singlestoredb/vectorstore.py +192 -0
  175. singlestoredb/warnings.py +5 -0
  176. singlestoredb-1.16.1.dist-info/METADATA +165 -0
  177. singlestoredb-1.16.1.dist-info/RECORD +183 -0
  178. singlestoredb-1.16.1.dist-info/WHEEL +5 -0
  179. singlestoredb-1.16.1.dist-info/entry_points.txt +2 -0
  180. singlestoredb-1.16.1.dist-info/licenses/LICENSE +201 -0
  181. singlestoredb-1.16.1.dist-info/top_level.txt +3 -0
  182. sqlx/__init__.py +4 -0
  183. 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))