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
@@ -5,22 +5,25 @@ import time
5
5
 
6
6
  import pytest
7
7
 
8
- import singlestoredb.clients.pymysqlsv as sv
9
- import singlestoredb.clients.pymysqlsv.cursors as cursors
10
- from singlestoredb.clients.pymysqlsv.err import ProgrammingError
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
- """test every data type"""
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, s varchar(32), u varchar(32), bb blob, d date, dt datetime, ts timestamp, td time, t time, st datetime)',
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) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)',
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) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)',
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
- self.assertEqual(((4,), (8,)), r)
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
- """test dict escaping"""
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
- """test binary data"""
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
- """test blob data"""
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
- """test conversion of null, empty string"""
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
- """test timedelta conversion"""
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'), time('-12:30'), time('-23:12:59'), time('-23:12:59.05100'), time('-00:30')",
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
- """test datetime conversion w microseconds"""
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
- """test a fetchone() with no rows"""
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
- """test aggregate functions"""
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
- """test a single tuple"""
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(json.loads(res), json.loads(json_str))
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(json.loads(res), json.loads(json_str))
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(self.cursor_type)
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
- """executemany should work with "insert ... on update" """
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)]