singlestoredb 1.14.1__cp38-abi3-win32.whl → 1.15.0__cp38-abi3-win32.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 (30) hide show
  1. _singlestoredb_accel.pyd +0 -0
  2. singlestoredb/__init__.py +14 -10
  3. singlestoredb/apps/_python_udfs.py +3 -3
  4. singlestoredb/config.py +5 -0
  5. singlestoredb/functions/decorator.py +32 -13
  6. singlestoredb/functions/ext/asgi.py +287 -27
  7. singlestoredb/functions/ext/timer.py +98 -0
  8. singlestoredb/functions/typing/numpy.py +20 -0
  9. singlestoredb/functions/typing/pandas.py +2 -0
  10. singlestoredb/functions/typing/polars.py +2 -0
  11. singlestoredb/functions/typing/pyarrow.py +2 -0
  12. singlestoredb/fusion/handler.py +17 -4
  13. singlestoredb/magics/run_personal.py +82 -1
  14. singlestoredb/magics/run_shared.py +82 -1
  15. singlestoredb/management/__init__.py +1 -0
  16. singlestoredb/management/export.py +1 -1
  17. singlestoredb/management/region.py +92 -0
  18. singlestoredb/management/workspace.py +180 -1
  19. singlestoredb/tests/ext_funcs/__init__.py +94 -55
  20. singlestoredb/tests/test.sql +22 -0
  21. singlestoredb/tests/test_ext_func.py +90 -0
  22. singlestoredb/tests/test_fusion.py +4 -1
  23. singlestoredb/tests/test_management.py +253 -20
  24. {singlestoredb-1.14.1.dist-info → singlestoredb-1.15.0.dist-info}/METADATA +3 -2
  25. {singlestoredb-1.14.1.dist-info → singlestoredb-1.15.0.dist-info}/RECORD +30 -25
  26. /singlestoredb/functions/{typing.py → typing/__init__.py} +0 -0
  27. {singlestoredb-1.14.1.dist-info → singlestoredb-1.15.0.dist-info}/LICENSE +0 -0
  28. {singlestoredb-1.14.1.dist-info → singlestoredb-1.15.0.dist-info}/WHEEL +0 -0
  29. {singlestoredb-1.14.1.dist-info → singlestoredb-1.15.0.dist-info}/entry_points.txt +0 -0
  30. {singlestoredb-1.14.1.dist-info → singlestoredb-1.15.0.dist-info}/top_level.txt +0 -0
@@ -162,6 +162,43 @@ class TestExtFunc(unittest.TestCase):
162
162
  'from data order by id',
163
163
  )
164
164
 
165
+ def test_timeout_double_mult(self):
166
+ with self.assertRaises(self.conn.OperationalError) as exc:
167
+ self.cur.execute(
168
+ 'select timeout_double_mult(value, 100) as res '
169
+ 'from longer_data order by id',
170
+ )
171
+ assert 'timeout' in str(exc.exception).lower()
172
+
173
+ def test_async_double_mult(self):
174
+ self.cur.execute(
175
+ 'select async_double_mult(value, 100) as res from data order by id',
176
+ )
177
+
178
+ assert [tuple(x) for x in self.cur] == \
179
+ [(200.0,), (200.0,), (500.0,), (400.0,), (0.0,)]
180
+
181
+ desc = self.cur.description
182
+ assert len(desc) == 1
183
+ assert desc[0].name == 'res'
184
+ assert desc[0].type_code == ft.DOUBLE
185
+ assert desc[0].null_ok is False
186
+
187
+ # NULL is not valid
188
+ with self.assertRaises(self.conn.OperationalError):
189
+ self.cur.execute(
190
+ 'select async_double_mult(value, NULL) as res '
191
+ 'from data order by id',
192
+ )
193
+
194
+ def test_async_timeout_double_mult(self):
195
+ with self.assertRaises(self.conn.OperationalError) as exc:
196
+ self.cur.execute(
197
+ 'select async_timeout_double_mult(value, 100) as res '
198
+ 'from longer_data order by id',
199
+ )
200
+ assert 'timeout' in str(exc.exception).lower()
201
+
165
202
  def test_pandas_double_mult(self):
166
203
  self.cur.execute(
167
204
  'select pandas_double_mult(value, 100) as res '
@@ -206,6 +243,28 @@ class TestExtFunc(unittest.TestCase):
206
243
  'from data order by id',
207
244
  )
208
245
 
246
+ def test_async_numpy_double_mult(self):
247
+ self.cur.execute(
248
+ 'select async_numpy_double_mult(value, 100) as res '
249
+ 'from data order by id',
250
+ )
251
+
252
+ assert [tuple(x) for x in self.cur] == \
253
+ [(200.0,), (200.0,), (500.0,), (400.0,), (0.0,)]
254
+
255
+ desc = self.cur.description
256
+ assert len(desc) == 1
257
+ assert desc[0].name == 'res'
258
+ assert desc[0].type_code == ft.DOUBLE
259
+ assert desc[0].null_ok is False
260
+
261
+ # NULL is not valid
262
+ with self.assertRaises(self.conn.OperationalError):
263
+ self.cur.execute(
264
+ 'select async_numpy_double_mult(value, NULL) as res '
265
+ 'from data order by id',
266
+ )
267
+
209
268
  def test_arrow_double_mult(self):
210
269
  self.cur.execute(
211
270
  'select arrow_double_mult(value, 100) as res '
@@ -1246,6 +1305,17 @@ class TestExtFunc(unittest.TestCase):
1246
1305
  assert desc[0].type_code == ft.LONGLONG
1247
1306
  assert desc[0].null_ok is False
1248
1307
 
1308
+ def test_async_table_function(self):
1309
+ self.cur.execute('select * from async_table_function(5)')
1310
+
1311
+ assert [x[0] for x in self.cur] == [10, 10, 10, 10, 10]
1312
+
1313
+ desc = self.cur.description
1314
+ assert len(desc) == 1
1315
+ assert desc[0].name == 'a'
1316
+ assert desc[0].type_code == ft.LONGLONG
1317
+ assert desc[0].null_ok is False
1318
+
1249
1319
  def test_table_function_tuple(self):
1250
1320
  self.cur.execute('select * from table_function_tuple(3)')
1251
1321
 
@@ -1310,6 +1380,26 @@ class TestExtFunc(unittest.TestCase):
1310
1380
  assert desc[1].type_code == ft.DOUBLE
1311
1381
  assert desc[1].null_ok is False
1312
1382
 
1383
+ def test_async_vec_function_df(self):
1384
+ self.cur.execute('select * from async_vec_function_df(5, 10)')
1385
+
1386
+ out = list(self.cur)
1387
+
1388
+ assert out == [
1389
+ (1, 1.1),
1390
+ (2, 2.2),
1391
+ (3, 3.3),
1392
+ ]
1393
+
1394
+ desc = self.cur.description
1395
+ assert len(desc) == 2
1396
+ assert desc[0].name == 'res'
1397
+ assert desc[0].type_code == ft.SHORT
1398
+ assert desc[0].null_ok is False
1399
+ assert desc[1].name == 'res2'
1400
+ assert desc[1].type_code == ft.DOUBLE
1401
+ assert desc[1].null_ok is False
1402
+
1313
1403
  def test_vec_function_ints_masked(self):
1314
1404
  self.cur.execute('select * from vec_function_ints_masked(5, 10)')
1315
1405
 
@@ -499,7 +499,10 @@ class TestJobsFusion(unittest.TestCase):
499
499
  @classmethod
500
500
  def tearDownClass(cls):
501
501
  for job_id in cls.job_ids:
502
- cls.manager.organizations.current.jobs.delete(job_id)
502
+ try:
503
+ cls.manager.organizations.current.jobs.delete(job_id)
504
+ except Exception:
505
+ pass
503
506
  if cls.workspace_group is not None:
504
507
  cls.workspace_group.terminate(force=True)
505
508
  cls.manager = None
@@ -13,6 +13,9 @@ import pytest
13
13
  import singlestoredb as s2
14
14
  from singlestoredb.management.job import Status
15
15
  from singlestoredb.management.job import TargetType
16
+ from singlestoredb.management.region import Region
17
+ from singlestoredb.management.region import RegionManager
18
+ from singlestoredb.management.utils import NamedList
16
19
 
17
20
 
18
21
  TEST_DIR = pathlib.Path(os.path.dirname(__file__))
@@ -363,6 +366,121 @@ class TestWorkspace(unittest.TestCase):
363
366
  assert 'endpoint' in cm.exception.msg, cm.exception.msg
364
367
 
365
368
 
369
+ @pytest.mark.skip('Not implemented in server yet')
370
+ @pytest.mark.management
371
+ class TestStarterWorkspace(unittest.TestCase):
372
+
373
+ manager = None
374
+ starter_workspace = None
375
+ starter_workspace_user = {
376
+ 'username': 'starter_user',
377
+ 'password': None,
378
+ }
379
+
380
+ @property
381
+ def starter_username(self):
382
+ """Return the username for the starter workspace user."""
383
+ return self.starter_workspace_user['username']
384
+
385
+ @property
386
+ def password(self):
387
+ """Return the password for the starter workspace user."""
388
+ return self.starter_workspace_user['password']
389
+
390
+ @classmethod
391
+ def setUpClass(cls):
392
+ cls.manager = s2.manage_workspaces()
393
+
394
+ us_regions = [x for x in cls.manager.regions if 'US' in x.name]
395
+ cls.password = secrets.token_urlsafe(20) + '-x&$'
396
+
397
+ name = clean_name(secrets.token_urlsafe(20)[:20])
398
+
399
+ cls.starter_workspace = cls.manager.create_starter_workspace(
400
+ f'starter-ws-test-{name}',
401
+ database_name=f'starter_db_{name}',
402
+ workspace_group={
403
+ 'cell_id': random.choice(us_regions).id,
404
+ },
405
+ )
406
+
407
+ cls.starter_workspace.create_user(
408
+ username=cls.starter_username,
409
+ password=cls.password,
410
+ )
411
+
412
+ @classmethod
413
+ def tearDownClass(cls):
414
+ if cls.starter_workspace is not None:
415
+ cls.starter_workspace.terminate()
416
+ cls.manager = None
417
+ cls.password = None
418
+
419
+ def test_str(self):
420
+ assert self.starter_workspace.name in str(self.starter_workspace.name)
421
+
422
+ def test_repr(self):
423
+ assert repr(self.starter_workspace) == str(self.starter_workspace)
424
+
425
+ def test_get_starter_workspace(self):
426
+ workspace = self.manager.get_starter_workspace(self.starter_workspace.id)
427
+ assert workspace.id == self.starter_workspace.id, workspace.id
428
+
429
+ with self.assertRaises(s2.ManagementError) as cm:
430
+ workspace = self.manager.get_starter_workspace('bad id')
431
+
432
+ assert 'UUID' in cm.exception.msg, cm.exception.msg
433
+
434
+ def test_starter_workspaces(self):
435
+ workspaces = self.manager.starter_workspaces
436
+ ids = [x.id for x in workspaces]
437
+ names = [x.name for x in workspaces]
438
+ assert self.starter_workspace.id in ids
439
+ assert self.starter_workspace.name in names
440
+
441
+ objs = {}
442
+ for item in workspaces:
443
+ objs[item.id] = item
444
+ objs[item.name] = item
445
+
446
+ name = random.choice(names)
447
+ assert workspaces[name] == objs[name]
448
+ id = random.choice(ids)
449
+ assert workspaces[id] == objs[id]
450
+
451
+ def test_no_manager(self):
452
+ workspace = self.manager.get_starter_workspace(self.starter_workspace.id)
453
+ workspace._manager = None
454
+
455
+ with self.assertRaises(s2.ManagementError) as cm:
456
+ workspace.refresh()
457
+
458
+ assert 'No workspace manager' in cm.exception.msg, cm.exception.msg
459
+
460
+ with self.assertRaises(s2.ManagementError) as cm:
461
+ workspace.terminate()
462
+
463
+ assert 'No workspace manager' in cm.exception.msg, cm.exception.msg
464
+
465
+ def test_connect(self):
466
+ with self.starter_workspace.connect(
467
+ user=self.starter_username,
468
+ password=self.password,
469
+ ) as conn:
470
+ with conn.cursor() as cur:
471
+ cur.execute('show databases')
472
+ assert 'starter_db' in [x[0] for x in list(cur)]
473
+
474
+ # Test missing endpoint
475
+ workspace = self.manager.get_starter_workspace(self.starter_workspace.id)
476
+ workspace.endpoint = None
477
+
478
+ with self.assertRaises(s2.ManagementError) as cm:
479
+ workspace.connect(user='admin', password=self.password)
480
+
481
+ assert 'endpoint' in cm.exception.msg, cm.exception.msg
482
+
483
+
366
484
  @pytest.mark.management
367
485
  class TestStage(unittest.TestCase):
368
486
 
@@ -397,13 +515,16 @@ class TestStage(unittest.TestCase):
397
515
  def test_upload_file(self):
398
516
  st = self.wg.stage
399
517
 
518
+ upload_test_sql = f'upload_test_{id(self)}.sql'
519
+ upload_test2_sql = f'upload_test2_{id(self)}.sql'
520
+
400
521
  root = st.info('/')
401
522
  assert str(root.path) == '/'
402
523
  assert root.type == 'directory'
403
524
 
404
525
  # Upload file
405
- f = st.upload_file(TEST_DIR / 'test.sql', 'upload_test.sql')
406
- assert str(f.path) == 'upload_test.sql'
526
+ f = st.upload_file(TEST_DIR / 'test.sql', upload_test_sql)
527
+ assert str(f.path) == upload_test_sql
407
528
  assert f.type == 'file'
408
529
 
409
530
  # Download and compare to original
@@ -412,15 +533,15 @@ class TestStage(unittest.TestCase):
412
533
 
413
534
  # Make sure we can't overwrite
414
535
  with self.assertRaises(OSError):
415
- st.upload_file(TEST_DIR / 'test.sql', 'upload_test.sql')
536
+ st.upload_file(TEST_DIR / 'test.sql', upload_test_sql)
416
537
 
417
538
  # Force overwrite with new content; use file object this time
418
539
  f = st.upload_file(
419
540
  open(TEST_DIR / 'test2.sql', 'r'),
420
- 'upload_test.sql',
541
+ upload_test_sql,
421
542
  overwrite=True,
422
543
  )
423
- assert str(f.path) == 'upload_test.sql'
544
+ assert str(f.path) == upload_test_sql
424
545
  assert f.type == 'file'
425
546
 
426
547
  # Verify new content
@@ -442,9 +563,9 @@ class TestStage(unittest.TestCase):
442
563
  # Write file into folder
443
564
  f = st.upload_file(
444
565
  TEST_DIR / 'test2.sql',
445
- os.path.join(lib.path, 'upload_test2.sql'),
566
+ os.path.join(lib.path, upload_test2_sql),
446
567
  )
447
- assert str(f.path) == 'lib/upload_test2.sql'
568
+ assert str(f.path) == 'lib/' + upload_test2_sql
448
569
  assert f.type == 'file'
449
570
 
450
571
  def test_open(self):
@@ -928,7 +1049,10 @@ class TestJob(unittest.TestCase):
928
1049
  @classmethod
929
1050
  def tearDownClass(cls):
930
1051
  for job_id in cls.job_ids:
931
- cls.manager.organizations.current.jobs.delete(job_id)
1052
+ try:
1053
+ cls.manager.organizations.current.jobs.delete(job_id)
1054
+ except Exception:
1055
+ pass
932
1056
  if cls.workspace_group is not None:
933
1057
  cls.workspace_group.terminate(force=True)
934
1058
  cls.workspace_group = None
@@ -1061,6 +1185,8 @@ class TestFileSpaces(unittest.TestCase):
1061
1185
  cls.shared_space = None
1062
1186
 
1063
1187
  def test_upload_file(self):
1188
+ upload_test_ipynb = f'upload_test_{id(self)}.ipynb'
1189
+
1064
1190
  for space in [self.personal_space, self.shared_space]:
1065
1191
  root = space.info('/')
1066
1192
  assert str(root.path) == '/'
@@ -1069,9 +1195,9 @@ class TestFileSpaces(unittest.TestCase):
1069
1195
  # Upload files
1070
1196
  f = space.upload_file(
1071
1197
  TEST_DIR / 'test.ipynb',
1072
- 'upload_test.ipynb',
1198
+ upload_test_ipynb,
1073
1199
  )
1074
- assert str(f.path) == 'upload_test.ipynb'
1200
+ assert str(f.path) == upload_test_ipynb
1075
1201
  assert f.type == 'notebook'
1076
1202
 
1077
1203
  # Download and compare to original
@@ -1082,15 +1208,15 @@ class TestFileSpaces(unittest.TestCase):
1082
1208
  with self.assertRaises(OSError):
1083
1209
  space.upload_file(
1084
1210
  TEST_DIR / 'test.ipynb',
1085
- 'upload_test.ipynb',
1211
+ upload_test_ipynb,
1086
1212
  )
1087
1213
 
1088
1214
  # Force overwrite with new content
1089
1215
  f = space.upload_file(
1090
1216
  TEST_DIR / 'test2.ipynb',
1091
- 'upload_test.ipynb', overwrite=True,
1217
+ upload_test_ipynb, overwrite=True,
1092
1218
  )
1093
- assert str(f.path) == 'upload_test.ipynb'
1219
+ assert str(f.path) == upload_test_ipynb
1094
1220
  assert f.type == 'notebook'
1095
1221
 
1096
1222
  # Verify new content
@@ -1102,9 +1228,11 @@ class TestFileSpaces(unittest.TestCase):
1102
1228
  space.upload_folder(TEST_DIR, 'test')
1103
1229
 
1104
1230
  # Cleanup
1105
- space.remove('upload_test.ipynb')
1231
+ space.remove(upload_test_ipynb)
1106
1232
 
1107
1233
  def test_upload_file_io(self):
1234
+ upload_test_ipynb = f'upload_test_{id(self)}.ipynb'
1235
+
1108
1236
  for space in [self.personal_space, self.shared_space]:
1109
1237
  root = space.info('/')
1110
1238
  assert str(root.path) == '/'
@@ -1113,9 +1241,9 @@ class TestFileSpaces(unittest.TestCase):
1113
1241
  # Upload files
1114
1242
  f = space.upload_file(
1115
1243
  open(TEST_DIR / 'test.ipynb', 'r'),
1116
- 'upload_test.ipynb',
1244
+ upload_test_ipynb,
1117
1245
  )
1118
- assert str(f.path) == 'upload_test.ipynb'
1246
+ assert str(f.path) == upload_test_ipynb
1119
1247
  assert f.type == 'notebook'
1120
1248
 
1121
1249
  # Download and compare to original
@@ -1126,15 +1254,15 @@ class TestFileSpaces(unittest.TestCase):
1126
1254
  with self.assertRaises(OSError):
1127
1255
  space.upload_file(
1128
1256
  open(TEST_DIR / 'test.ipynb', 'r'),
1129
- 'upload_test.ipynb',
1257
+ upload_test_ipynb,
1130
1258
  )
1131
1259
 
1132
1260
  # Force overwrite with new content
1133
1261
  f = space.upload_file(
1134
1262
  open(TEST_DIR / 'test2.ipynb', 'r'),
1135
- 'upload_test.ipynb', overwrite=True,
1263
+ upload_test_ipynb, overwrite=True,
1136
1264
  )
1137
- assert str(f.path) == 'upload_test.ipynb'
1265
+ assert str(f.path) == upload_test_ipynb
1138
1266
  assert f.type == 'notebook'
1139
1267
 
1140
1268
  # Verify new content
@@ -1146,7 +1274,7 @@ class TestFileSpaces(unittest.TestCase):
1146
1274
  space.upload_folder(TEST_DIR, 'test')
1147
1275
 
1148
1276
  # Cleanup
1149
- space.remove('upload_test.ipynb')
1277
+ space.remove(upload_test_ipynb)
1150
1278
 
1151
1279
  def test_open(self):
1152
1280
  for space in [self.personal_space, self.shared_space]:
@@ -1362,3 +1490,108 @@ class TestFileSpaces(unittest.TestCase):
1362
1490
 
1363
1491
  # Cleanup
1364
1492
  space.remove('obj_test_2.ipynb')
1493
+
1494
+
1495
+ @pytest.mark.skip('Not implemented in server yet')
1496
+ @pytest.mark.management
1497
+ class TestRegions(unittest.TestCase):
1498
+ """Test cases for region management."""
1499
+
1500
+ manager = None
1501
+
1502
+ @classmethod
1503
+ def setUpClass(cls):
1504
+ """Set up the test environment."""
1505
+ cls.manager = s2.manage_regions()
1506
+
1507
+ @classmethod
1508
+ def tearDownClass(cls):
1509
+ """Clean up the test environment."""
1510
+ cls.manager = None
1511
+
1512
+ def test_list_regions(self):
1513
+ """Test listing all regions."""
1514
+ regions = self.manager.list_regions()
1515
+
1516
+ # Verify we get a NamedList
1517
+ assert isinstance(regions, NamedList)
1518
+
1519
+ # Verify we have at least one region
1520
+ assert len(regions) > 0
1521
+
1522
+ # Verify region properties
1523
+ region = regions[0]
1524
+ assert isinstance(region, Region)
1525
+ assert hasattr(region, 'id')
1526
+ assert hasattr(region, 'name')
1527
+ assert hasattr(region, 'provider')
1528
+
1529
+ # Verify provider values
1530
+ providers = {x.provider for x in regions}
1531
+ assert 'Azure' in providers or 'GCP' in providers or 'AWS' in providers
1532
+
1533
+ # Verify region can be accessed by name or ID
1534
+ region_by_name = regions[region.name]
1535
+ region_by_id = regions[region.id]
1536
+ assert region_by_name == region_by_id
1537
+ assert region_by_name.id == region.id
1538
+ assert region_by_name.name == region.name
1539
+ assert region_by_name.provider == region.provider
1540
+
1541
+ def test_list_shared_tier_regions(self):
1542
+ """Test listing shared tier regions."""
1543
+ regions = self.manager.list_shared_tier_regions()
1544
+
1545
+ # Verify we get a NamedList
1546
+ assert isinstance(regions, NamedList)
1547
+
1548
+ # Verify region properties if we have any shared tier regions
1549
+ if regions:
1550
+ region = regions[0]
1551
+ assert isinstance(region, Region)
1552
+ assert hasattr(region, 'id')
1553
+ assert hasattr(region, 'name')
1554
+ assert hasattr(region, 'provider')
1555
+
1556
+ # Verify provider values
1557
+ providers = {x.provider for x in regions}
1558
+ assert any(p in providers for p in ['Azure', 'GCP', 'AWS'])
1559
+
1560
+ # Verify region can be accessed by name or ID
1561
+ region_by_name = regions[region.name]
1562
+ region_by_id = regions[region.id]
1563
+ assert region_by_name == region_by_id
1564
+ assert region_by_name.id == region.id
1565
+ assert region_by_name.name == region.name
1566
+ assert region_by_name.provider == region.provider
1567
+
1568
+ def test_str_repr(self):
1569
+ """Test string representation of regions."""
1570
+ regions = self.manager.list_regions()
1571
+ if not regions:
1572
+ self.skipTest('No regions available for testing')
1573
+
1574
+ region = regions[0]
1575
+
1576
+ # Test __str__
1577
+ s = str(region)
1578
+ assert region.id in s
1579
+ assert region.name in s
1580
+ assert region.provider in s
1581
+
1582
+ # Test __repr__
1583
+ assert repr(region) == str(region)
1584
+
1585
+ def test_no_manager(self):
1586
+ """Test behavior when manager is not available."""
1587
+ regions = self.manager.list_regions()
1588
+ if not regions:
1589
+ self.skipTest('No regions available for testing')
1590
+
1591
+ region = regions[0]
1592
+ region._manager = None
1593
+
1594
+ # Verify from_dict class method
1595
+ with self.assertRaises(s2.ManagementError) as cm:
1596
+ RegionManager.list_shared_tier_regions(None)
1597
+ assert 'No workspace manager' in str(cm.exception)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: singlestoredb
3
- Version: 1.14.1
3
+ Version: 1.15.0
4
4
  Summary: Interface to the SingleStoreDB database and workspace management APIs
5
5
  Home-page: https://github.com/singlestore-labs/singlestoredb-python
6
6
  Author: SingleStore
@@ -19,7 +19,6 @@ Requires-Dist: build
19
19
  Requires-Dist: parsimonious
20
20
  Requires-Dist: requests
21
21
  Requires-Dist: setuptools
22
- Requires-Dist: singlestore-vectorstore >=0.1.2
23
22
  Requires-Dist: sqlparams
24
23
  Requires-Dist: wheel
25
24
  Requires-Dist: tomli >=1.1.0 ; python_version < "3.11"
@@ -44,6 +43,8 @@ Provides-Extra: rsa
44
43
  Requires-Dist: cryptography ; extra == 'rsa'
45
44
  Provides-Extra: sqlalchemy
46
45
  Requires-Dist: sqlalchemy-singlestoredb >=1.0.0 ; extra == 'sqlalchemy'
46
+ Provides-Extra: vectorstore
47
+ Requires-Dist: singlestore-vectorstore >=0.1.2 ; extra == 'vectorstore'
47
48
 
48
49
  # <img src="https://github.com/singlestore-labs/singlestoredb-python/blob/main/resources/singlestore-logo.png" height="60" valign="middle"/> SingleStoreDB Python SDK
49
50
 
@@ -1,7 +1,7 @@
1
- _singlestoredb_accel.pyd,sha256=44TC8rZGqJ2E373qMsrMCXTy3HvMz65Vh-x52kQtmDY,62464
2
- singlestoredb/__init__.py,sha256=S78W6cTcUSwZR1BTOayQSnIGbOgnKs4Tmw_VSxYqgco,2162
1
+ _singlestoredb_accel.pyd,sha256=BWW5HD6bSkMmTIwoNTWdcnfsv1s7_EYCzlkjwNN5Ul8,65024
2
+ singlestoredb/__init__.py,sha256=clWiqGSlfnQ2WHAshLofzYKXnj8IcnkkIG5b7Hv7LZs,2347
3
3
  singlestoredb/auth.py,sha256=RmYiH0Wlc2RXc4pTlRMysxtBI445ggCIwojWKC_eDLE,7844
4
- singlestoredb/config.py,sha256=t3aiWi1i3kT5VhEgXca0gwT6591YkZUed-wzvVEBMs0,13424
4
+ singlestoredb/config.py,sha256=ZTySXaWhHalaEKgCYlR5U4e9gj-o43X8ClXG18t-DoE,13629
5
5
  singlestoredb/connection.py,sha256=I2AP_0l7hNARfXiSuVW953CsGYn_rKbTg_NyWEiGHbY,47542
6
6
  singlestoredb/converters.py,sha256=6gN3_RzSbw0Aimd5cGgBNPNq1yiHb1a_NK8qC9DmOQ0,21636
7
7
  singlestoredb/exceptions.py,sha256=WCCJrNSsU-hD-621Jpd6bwmvGftQ7byXkk-XKXlaxpg,3354
@@ -19,25 +19,30 @@ singlestoredb/apps/_config.py,sha256=b_Op6KjSJdPwym-AlHcy0dXLHiks1cL8Q2ea1W8r3NA
19
19
  singlestoredb/apps/_connection_info.py,sha256=P9rW4t2k3QFk3A34dIg9DbCWBqrcHDcZPi2Q9r2-o3A,321
20
20
  singlestoredb/apps/_dashboards.py,sha256=qEdDivjwS68Uukay0Qw-3awHZFpkcqapzd3vLaVUzWo,1521
21
21
  singlestoredb/apps/_process.py,sha256=eMiBO4piaRX1S6zdnMx0X0E4J7E1XrXndnVW0GRYq1Y,976
22
- singlestoredb/apps/_python_udfs.py,sha256=PW-Lai3dFINsNtqrLlyUafWgs1j86qGqaNZpUD9OxVI,2811
22
+ singlestoredb/apps/_python_udfs.py,sha256=d25hhWKl5ou5r7m0Uaf1xZLz9mCHK1Y6MSLzvmqyibA,2858
23
23
  singlestoredb/apps/_stdout_supress.py,sha256=QRV-IHQQMvWMeJfqORuVE2-Il6ohO2Ti4IokFoTCJWE,689
24
24
  singlestoredb/apps/_uvicorn_util.py,sha256=Petkmq5keBPfXZsHBrnZfY3O2rUHvb3Cw6o-BRz5MP0,994
25
25
  singlestoredb/functions/__init__.py,sha256=KPBjRaiVipCQwTSsryHvBE_qrwy7Kj74lKnutqplcao,487
26
- singlestoredb/functions/decorator.py,sha256=Zw4mTSzpTxFTdqfrFzdt_8hFptg0PXcrB3TbUMNynyU,5614
26
+ singlestoredb/functions/decorator.py,sha256=V_2BbTl6-g66-WwNHMdLbOxvCAOQn5_DQHg66reoL48,6597
27
27
  singlestoredb/functions/dtypes.py,sha256=7w_atIL5jAvDNtu6RDCvY440Y9U-p19_Nf7R5ki46Co,41607
28
28
  singlestoredb/functions/signature.py,sha256=K1WftlfVei2xmizCxHi91z7mK8vW5VJxJAM7FiCnpEY,43926
29
- singlestoredb/functions/typing.py,sha256=5AJG4nx-HKCeemNxL0qc1VunYPJ5lHRzpYAK_qMybNw,1380
30
29
  singlestoredb/functions/utils.py,sha256=lZPxdYfHxrSfxGWCoF0YZyakVy2iYlozJ1lPSaPKRlo,11190
31
30
  singlestoredb/functions/ext/__init__.py,sha256=5ppI8IZN_zOwoJFdu_Oq9ipxtyHw9n6OMVAa_s9T_yY,24
32
31
  singlestoredb/functions/ext/arrow.py,sha256=mQhwaMpvCH_dP92WIhP_j-stu272n4UAHsFUOBTgnq0,9436
33
- singlestoredb/functions/ext/asgi.py,sha256=vFX-7P7aVItK76AxBw-DjLGy0nDV9KzcJYyLsLRCsi0,53455
32
+ singlestoredb/functions/ext/asgi.py,sha256=R1mVZhyOQBuDKLqF1DT0kbiH76uGrC-l1piBkwjq2C0,62064
34
33
  singlestoredb/functions/ext/json.py,sha256=j9133xOpyuSqb8smBmi_bPvv6OYCbNfpbLbEicyGqmQ,10522
35
34
  singlestoredb/functions/ext/mmap.py,sha256=0BN9OyEONZ174qdZWe2m3Xykt3-QcxyLYBt2iCG772Q,14123
36
35
  singlestoredb/functions/ext/rowdat_1.py,sha256=UNMMUA8mb6iIRfJV2FsdA20Sw6s-LEdHQ_tC4K4g70Q,21836
36
+ singlestoredb/functions/ext/timer.py,sha256=XOI_K-ikOM5xtXnDkmvIwBV4mUS7EWSziKEx2121KaI,3061
37
37
  singlestoredb/functions/ext/utils.py,sha256=OPMFD-tTCx2Kk9jguQkrTr7e4AgNkt15YsvaT1YSmN8,5480
38
+ singlestoredb/functions/typing/__init__.py,sha256=5AJG4nx-HKCeemNxL0qc1VunYPJ5lHRzpYAK_qMybNw,1380
39
+ singlestoredb/functions/typing/numpy.py,sha256=WJt0bWwyEA8Mofpn_-0Q82u7Q8XAtzBuhbaXSqE1E34,681
40
+ singlestoredb/functions/typing/pandas.py,sha256=-abvGDup-WwTbaAyQuNo4Fq7ATe8gYx_5b2yUPJlX7o,85
41
+ singlestoredb/functions/typing/polars.py,sha256=HWAjc6o6NAAXZjNIUyLe5R4ZgrIz2NHjk43wTSpy4bY,85
42
+ singlestoredb/functions/typing/pyarrow.py,sha256=gQcvvrm5BYeuYl8UKr8-07DbA_AtbpkiSEtQkRMW7AA,82
38
43
  singlestoredb/fusion/__init__.py,sha256=FHWtrg6OJFTf6Ye197V5sU6ssryr2h6FBcDIgXP7-H4,367
39
44
  singlestoredb/fusion/graphql.py,sha256=SHqsPe4xgawdsTPHEtJGQlybYGWqPrGMmyK-v20RLac,5420
40
- singlestoredb/fusion/handler.py,sha256=ohnU0BIoJ9AHrVLlCHI-3E4Icqoocxqip8T-XyYxBWQ,28293
45
+ singlestoredb/fusion/handler.py,sha256=JmdIjBUUUDUKsgqTBc7pL_NVvUPXha90VpfAd03mHL4,28598
41
46
  singlestoredb/fusion/registry.py,sha256=_eT1gd38VPlFKs5f9Pu6lqQyoDQ_ixW5O56QwYLQ89Y,6361
42
47
  singlestoredb/fusion/result.py,sha256=KAwhXxXVgfkAWekCFY8-Y03ANKDiTflYRXyEc_1Id0k,12189
43
48
  singlestoredb/fusion/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -51,20 +56,20 @@ singlestoredb/fusion/handlers/workspace.py,sha256=NxoEY5xd5lCQmXiim4nhAYCL0agHo1
51
56
  singlestoredb/http/__init__.py,sha256=4cEDvLloGc3LSpU-PnIwacyu0n5oIIIE6xk2SPyWD_w,939
52
57
  singlestoredb/http/connection.py,sha256=X-zRf7BfsaKRg8GXcaa5Ic42b9uqEfqqxiI47ZijpDE,41221
53
58
  singlestoredb/magics/__init__.py,sha256=fqCBQ0s8o1CYE4Xo_XiSbkLDzLgMNDgpSkOx66-uDZw,1244
54
- singlestoredb/magics/run_personal.py,sha256=M11xHi9lWquh_pLSpFI89LGE7PhOPQOGqlSPDl48itE,1900
55
- singlestoredb/magics/run_shared.py,sha256=rnKpW4d8CJvD6ehK8jG8FlxuqZvjZl4KocPTsk-23O8,1805
56
- singlestoredb/management/__init__.py,sha256=A66ZnFyX--PsAZ2tvtYUfIUBvVGDBFQsnVc6nGTlX60,277
59
+ singlestoredb/magics/run_personal.py,sha256=D71VVRk-qQAZf6fHUbxqTadxcopSklJu7ccoQ82uhV8,5359
60
+ singlestoredb/magics/run_shared.py,sha256=9Lo3hmESgp0gGLaL1pgLtTA6qsbIZluM7mufcoCAVcI,5264
61
+ singlestoredb/management/__init__.py,sha256=wsTdU9mRZuKuJNOu7aPWlmy3dEhRxUIeNIzKQh4IwME,313
57
62
  singlestoredb/management/billing_usage.py,sha256=0UHFSPCrN0nyeGFFM-HXS3NP8pYmYo2BCCahDEPXvzg,3883
58
63
  singlestoredb/management/cluster.py,sha256=auBzNYIXvnI6rq3DNpPgJhwWoT6JsyZRikjpON23Pxg,14867
59
- singlestoredb/management/export.py,sha256=T2uU2EaeFYitvK_7475U_wYJS-rnGLE1RsTsP6XbsQs,9376
64
+ singlestoredb/management/export.py,sha256=9kNb9C9HHyUrIfIWVvpghal47SQutoa2PTPmysIPSq8,9378
60
65
  singlestoredb/management/files.py,sha256=Z9GpS2EHf9atE8kJdz1vJtsiT80O6TV00MPhqyXfAAw,31579
61
66
  singlestoredb/management/inference_api.py,sha256=9d9-7edoZ6JI3SPvStcVDOSHOY6l38V1MFpyskdLAZY,2684
62
67
  singlestoredb/management/job.py,sha256=Npfe1JLYJlggGBrXLniPKwKUKF1i3alvSY1SFtvauSs,25498
63
68
  singlestoredb/management/manager.py,sha256=iB4XcerOPNoFc04TN40vjosMrDhlE7HMUyHsseRgjBQ,9224
64
69
  singlestoredb/management/organization.py,sha256=viFG8eLVOs-NeoL6zm8nypFRQ-oiRDD2Sk-bL2b6hvw,6095
65
- singlestoredb/management/region.py,sha256=oGoLLS88dE1GmY7GCc0BV7X3f7bWwKQyeXOVBFmK9Pk,1678
70
+ singlestoredb/management/region.py,sha256=2MyC7JzK5Bh7iMcHKVPVQK6NsD-TDb4AcT_gAcnE_Mg,3997
66
71
  singlestoredb/management/utils.py,sha256=RtFhdIIliQ6aulYs99fgAQ0FxL2LfV-5oPRd9s_bBok,13626
67
- singlestoredb/management/workspace.py,sha256=D9DzpeWU7xFjpj8bBYiXyasjVYVANeYjTzgkz2aKvJQ,57984
72
+ singlestoredb/management/workspace.py,sha256=_FnVX2-aZKZ-OysUn6J6FMV6RlwsCW3KTAQQtOnJLN8,64263
68
73
  singlestoredb/mysql/__init__.py,sha256=CbpwzNUJPAmKPpIobC0-ugBta_RgHCMq7X7N75QLReY,4669
69
74
  singlestoredb/mysql/_auth.py,sha256=YaqqyvAHmeraBv3BM207rNveUVPM-mPnW20ts_ynVWg,8341
70
75
  singlestoredb/mysql/charset.py,sha256=mnCdMpvdub1S2mm2PSk2j5JddgsWRjsVLtGx-y9TskE,10724
@@ -116,7 +121,7 @@ singlestoredb/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
116
121
  singlestoredb/tests/empty.sql,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
117
122
  singlestoredb/tests/local_infile.csv,sha256=0fYxcZcTvcwS2McF4sktFsipRY1G-ClGmCRR1eCqdEQ,45
118
123
  singlestoredb/tests/test.ipynb,sha256=IEgXbByXyWDplZvod1J2SqNHZiPOGdD4oNVMd0ArP7s,234
119
- singlestoredb/tests/test.sql,sha256=winJzhZ2W52PcQ1j8X_NNIDRBmEa-xMAYrS_hoUtAP8,18337
124
+ singlestoredb/tests/test.sql,sha256=hDz6dWTpsXxUbVYmpfD-KjqasA2olKHN7G0y0Pbpn5M,19320
120
125
  singlestoredb/tests/test2.ipynb,sha256=_kBQVvEoinQ1zInNcWFKpbdw-djkLsEO8l3g2MEU_Zs,236
121
126
  singlestoredb/tests/test2.sql,sha256=CEM8_lX189iQU65G3Pod7lig6osfrveQyoDz6HC35YQ,38
122
127
  singlestoredb/tests/test_basics.py,sha256=tKzeSN8koMRFq5yjb98Wz5VWAOsnUKAETZEJyLhMD_o,49778
@@ -124,11 +129,11 @@ singlestoredb/tests/test_config.py,sha256=Ad0PDmCnJMOyy9f7WTKiRasSR_3mYRByUlSb7k
124
129
  singlestoredb/tests/test_connection.py,sha256=UmoNo8erkcifEMbHZl83yAaRsyh6HANRdEtY3aViOK8,122792
125
130
  singlestoredb/tests/test_dbapi.py,sha256=cNJoTEZvYG7ckcwT7xqlkJX-2TDEYGTDDU1Igucp48k,679
126
131
  singlestoredb/tests/test_exceptions.py,sha256=vscMYmdOJr0JmkTAJrNI2w0Q96Nfugjkrt5_lYnw8i0,1176
127
- singlestoredb/tests/test_ext_func.py,sha256=LhuPz8o3UF7x2LNod5oZ1tlxeLvGDEUE5FnzdsIbSPs,44643
132
+ singlestoredb/tests/test_ext_func.py,sha256=YidPnlO7HWsVIbPwdCa33Oo8SyGkP2_Pcuj_pu39r4s,47743
128
133
  singlestoredb/tests/test_ext_func_data.py,sha256=9kn8BWmCjkbnP6hSbFhmhcdW4OmVT-GSvBTIzFBLEys,48796
129
- singlestoredb/tests/test_fusion.py,sha256=S0Jk2NrcOitqM98r5fosHGbZ1sCZ2uxar5t48v-uOD0,52045
134
+ singlestoredb/tests/test_fusion.py,sha256=XT5rhYx32mndcZGaW2Xc7DTLMLEcf_vO3w1Dxss9nMM,52120
130
135
  singlestoredb/tests/test_http.py,sha256=7hwXe61hlUes3nji0MTTZweo94tJAlJ-vA5ct9geXFQ,8868
131
- singlestoredb/tests/test_management.py,sha256=JGmfI408wp6lCzeteK7qSuiFOMfAgqkpE0jy-DP7uL0,46935
136
+ singlestoredb/tests/test_management.py,sha256=IkkuLw957xV8-BWWtkv-VKRcU5y155C_FNfDJYp0MEE,54834
132
137
  singlestoredb/tests/test_plugin.py,sha256=P1nXLnTafaHkHN-6bVbGryxTu7OWJPU9SYFZ_WQUwq8,845
133
138
  singlestoredb/tests/test_results.py,sha256=Zg1ynZFRZqalAMfNLOU5C6BDXaox6JxrKm_XZwVNFcg,6753
134
139
  singlestoredb/tests/test_types.py,sha256=YeVE6KPqlqzJke-4hbRmc8ko1E7RLHu5S8qLg04Bl5Y,4632
@@ -137,7 +142,7 @@ singlestoredb/tests/test_udf_returns.py,sha256=lDx26AUKGS4V0Vxf5ePO-VcrcX0QamyWG
137
142
  singlestoredb/tests/test_vectorstore.py,sha256=Zy9N63KPcm9bdjMN2dc1iwBZ5J8wK-p96xT6tF8Wk0M,1605
138
143
  singlestoredb/tests/test_xdict.py,sha256=5ArRJqd5aNXkPK7Y6sFeRbqZ59MZ1YaGBpSlDAbBrjM,10741
139
144
  singlestoredb/tests/utils.py,sha256=WR8GFNiC0lU4tz21Y3rlbbp9Gz9WcSwp2jpUSCj7RFU,5136
140
- singlestoredb/tests/ext_funcs/__init__.py,sha256=8kGNrG2qZVcmaAc4KAatrqZYPjBXtKbOqoG7zAwMtM4,14727
145
+ singlestoredb/tests/ext_funcs/__init__.py,sha256=ctEOG0tDWmcE2LSEcvv2Yqk9CVi4PM5rouoRZnZe5t4,15610
141
146
  singlestoredb/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
147
  singlestoredb/utils/config.py,sha256=WVQ567ZzqzlTGueQH5fEpm5tPZuz8y7qvpEQUB-vPjk,25453
143
148
  singlestoredb/utils/convert_rows.py,sha256=gkZeZazeJvimCYEQ1FdAC-AmMDwmFGCuP6mi653bpns,1885
@@ -149,9 +154,9 @@ singlestoredb/utils/results.py,sha256=wR70LhCqlobniZf52r67zYLBOKjWHQm68NAskdRQND
149
154
  singlestoredb/utils/xdict.py,sha256=-wi1lSPTnY99fhVMBhPKJ8cCsQhNG4GMUfkEBDKYgCw,13321
150
155
  sqlx/__init__.py,sha256=4Sdn8HN-Hf8v0_wCt60DCckCg8BvgM3-9r4YVfZycRE,89
151
156
  sqlx/magic.py,sha256=6VBlotgjautjev599tHaTYOfcfOA9m6gV_-P1_Qc4lI,3622
152
- singlestoredb-1.14.1.dist-info/LICENSE,sha256=Bojenzui8aPNjlF3w4ojguDP7sTf8vFV_9Gc2UAG1sg,11542
153
- singlestoredb-1.14.1.dist-info/METADATA,sha256=7RYWH5ZbFrph0qvRKBQo-ZnhQhL9xuVb2rGrdezCQGU,5895
154
- singlestoredb-1.14.1.dist-info/WHEEL,sha256=c4k7z5HB0t-y0nBCv6KyJ6KCjn8SEGPddD0lhaPtU3E,96
155
- singlestoredb-1.14.1.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
156
- singlestoredb-1.14.1.dist-info/top_level.txt,sha256=lA65Vf4qAMfg_s1oG3LEO90h4t1Z-SPDbRqkevI3bSY,40
157
- singlestoredb-1.14.1.dist-info/RECORD,,
157
+ singlestoredb-1.15.0.dist-info/LICENSE,sha256=Bojenzui8aPNjlF3w4ojguDP7sTf8vFV_9Gc2UAG1sg,11542
158
+ singlestoredb-1.15.0.dist-info/METADATA,sha256=gvIMUB1wn7iBDU4zScxV4tDjwxQCqtwHBwipYFDbtnQ,5949
159
+ singlestoredb-1.15.0.dist-info/WHEEL,sha256=c4k7z5HB0t-y0nBCv6KyJ6KCjn8SEGPddD0lhaPtU3E,96
160
+ singlestoredb-1.15.0.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
161
+ singlestoredb-1.15.0.dist-info/top_level.txt,sha256=lA65Vf4qAMfg_s1oG3LEO90h4t1Z-SPDbRqkevI3bSY,40
162
+ singlestoredb-1.15.0.dist-info/RECORD,,