singlestoredb 1.12.4__py3-none-any.whl → 1.13.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.

Potentially problematic release.


This version of singlestoredb might be problematic. Click here for more details.

Files changed (35) hide show
  1. singlestoredb/__init__.py +1 -1
  2. singlestoredb/ai/__init__.py +1 -0
  3. singlestoredb/ai/chat.py +26 -0
  4. singlestoredb/ai/embeddings.py +18 -15
  5. singlestoredb/apps/__init__.py +1 -0
  6. singlestoredb/apps/_config.py +6 -0
  7. singlestoredb/apps/_connection_info.py +8 -0
  8. singlestoredb/apps/_python_udfs.py +85 -0
  9. singlestoredb/config.py +14 -2
  10. singlestoredb/functions/__init__.py +15 -1
  11. singlestoredb/functions/decorator.py +102 -252
  12. singlestoredb/functions/dtypes.py +545 -198
  13. singlestoredb/functions/ext/asgi.py +421 -129
  14. singlestoredb/functions/ext/json.py +29 -36
  15. singlestoredb/functions/ext/mmap.py +1 -1
  16. singlestoredb/functions/ext/rowdat_1.py +50 -70
  17. singlestoredb/functions/signature.py +816 -144
  18. singlestoredb/functions/typing.py +41 -0
  19. singlestoredb/functions/utils.py +421 -0
  20. singlestoredb/http/connection.py +3 -1
  21. singlestoredb/management/inference_api.py +101 -0
  22. singlestoredb/management/manager.py +6 -1
  23. singlestoredb/management/organization.py +17 -0
  24. singlestoredb/management/utils.py +2 -2
  25. singlestoredb/tests/ext_funcs/__init__.py +476 -237
  26. singlestoredb/tests/test_ext_func.py +192 -3
  27. singlestoredb/tests/test_management.py +5 -5
  28. singlestoredb/tests/test_udf.py +101 -131
  29. singlestoredb/tests/test_udf_returns.py +459 -0
  30. {singlestoredb-1.12.4.dist-info → singlestoredb-1.13.1.dist-info}/METADATA +2 -1
  31. {singlestoredb-1.12.4.dist-info → singlestoredb-1.13.1.dist-info}/RECORD +35 -29
  32. {singlestoredb-1.12.4.dist-info → singlestoredb-1.13.1.dist-info}/LICENSE +0 -0
  33. {singlestoredb-1.12.4.dist-info → singlestoredb-1.13.1.dist-info}/WHEEL +0 -0
  34. {singlestoredb-1.12.4.dist-info → singlestoredb-1.13.1.dist-info}/entry_points.txt +0 -0
  35. {singlestoredb-1.12.4.dist-info → singlestoredb-1.13.1.dist-info}/top_level.txt +0 -0
@@ -929,8 +929,10 @@ class TestExtFunc(unittest.TestCase):
929
929
  'from data_with_nulls order by id',
930
930
  )
931
931
 
932
+ # assert [tuple(x) for x in self.cur] == \
933
+ # [(200,), (200,), (500,), (None,), (0,)]
932
934
  assert [tuple(x) for x in self.cur] == \
933
- [(200,), (200,), (500,), (None,), (0,)]
935
+ [(200,), (200,), (500,), (0,), (0,)]
934
936
 
935
937
  desc = self.cur.description
936
938
  assert len(desc) == 1
@@ -1145,7 +1147,7 @@ class TestExtFunc(unittest.TestCase):
1145
1147
  assert desc[0].type_code == ft.BLOB
1146
1148
  assert desc[0].null_ok is True
1147
1149
 
1148
- def test_varchar_mult(self):
1150
+ def _test_varchar_mult(self):
1149
1151
  self.cur.execute(
1150
1152
  'select varchar_mult(name, value) as res '
1151
1153
  'from data order by id',
@@ -1172,7 +1174,7 @@ class TestExtFunc(unittest.TestCase):
1172
1174
  'from data order by id',
1173
1175
  )
1174
1176
 
1175
- def test_nullable_varchar_mult(self):
1177
+ def _test_nullable_varchar_mult(self):
1176
1178
  self.cur.execute(
1177
1179
  'select nullable_varchar_mult(name, value) as res '
1178
1180
  'from data_with_nulls order by id',
@@ -1191,3 +1193,190 @@ class TestExtFunc(unittest.TestCase):
1191
1193
  assert desc[0].name == 'res'
1192
1194
  assert desc[0].type_code == ft.BLOB
1193
1195
  assert desc[0].null_ok is True
1196
+
1197
+ def test_numpy_fixed_strings(self):
1198
+ self.cur.execute('select * from numpy_fixed_strings()')
1199
+
1200
+ assert [tuple(x) for x in self.cur] == [
1201
+ ('hello',),
1202
+ ('hi there 😜',),
1203
+ ('😜 bye',),
1204
+ ]
1205
+
1206
+ desc = self.cur.description
1207
+ assert len(desc) == 1
1208
+ assert desc[0].name == 'res'
1209
+ assert desc[0].type_code == ft.BLOB
1210
+ assert desc[0].null_ok is False
1211
+
1212
+ def test_numpy_fixed_binary(self):
1213
+ self.cur.execute('select * from numpy_fixed_binary()')
1214
+
1215
+ assert [tuple(x) for x in self.cur] == [
1216
+ ('hello'.encode('utf8'),),
1217
+ ('hi there 😜'.encode('utf8'),),
1218
+ ('😜 bye'.encode('utf8'),),
1219
+ ]
1220
+
1221
+ desc = self.cur.description
1222
+ assert len(desc) == 1
1223
+ assert desc[0].name == 'res'
1224
+ assert desc[0].type_code == ft.BLOB
1225
+ assert desc[0].null_ok is False
1226
+
1227
+ def test_no_args_no_return_value(self):
1228
+ self.cur.execute('select no_args_no_return_value() as res')
1229
+
1230
+ assert [tuple(x) for x in self.cur] == [(None,)]
1231
+
1232
+ desc = self.cur.description
1233
+ assert len(desc) == 1
1234
+ assert desc[0].name == 'res'
1235
+ assert desc[0].type_code == ft.TINY
1236
+ assert desc[0].null_ok is True
1237
+
1238
+ def test_table_function(self):
1239
+ self.cur.execute('select * from table_function(5)')
1240
+
1241
+ assert [x[0] for x in self.cur] == [10, 10, 10, 10, 10]
1242
+
1243
+ desc = self.cur.description
1244
+ assert len(desc) == 1
1245
+ assert desc[0].name == 'a'
1246
+ assert desc[0].type_code == ft.LONGLONG
1247
+ assert desc[0].null_ok is False
1248
+
1249
+ def test_table_function_tuple(self):
1250
+ self.cur.execute('select * from table_function_tuple(3)')
1251
+
1252
+ out = list(self.cur)
1253
+
1254
+ assert out == [
1255
+ (10, 10.0, 'ten'),
1256
+ (10, 10.0, 'ten'),
1257
+ (10, 10.0, 'ten'),
1258
+ ]
1259
+
1260
+ desc = self.cur.description
1261
+ assert len(desc) == 3
1262
+ assert desc[0].name == 'c_int'
1263
+ assert desc[1].name == 'c_float'
1264
+ assert desc[2].name == 'c_str'
1265
+
1266
+ def test_table_function_struct(self):
1267
+ self.cur.execute('select * from table_function_struct(3)')
1268
+
1269
+ out = list(self.cur)
1270
+
1271
+ assert out == [
1272
+ (10, 10.0, 'ten'),
1273
+ (10, 10.0, 'ten'),
1274
+ (10, 10.0, 'ten'),
1275
+ ]
1276
+
1277
+ desc = self.cur.description
1278
+ assert len(desc) == 3
1279
+ assert desc[0].name == 'c_int'
1280
+ assert desc[1].name == 'c_float'
1281
+ assert desc[2].name == 'c_str'
1282
+
1283
+ def test_vec_function(self):
1284
+ self.cur.execute('select vec_function(5, 10) as res')
1285
+
1286
+ assert [tuple(x) for x in self.cur] == [(50.0,)]
1287
+
1288
+ def test_vec_function_ints(self):
1289
+ self.cur.execute('select vec_function_ints(5, 10) as res')
1290
+
1291
+ assert [tuple(x) for x in self.cur] == [(50,)]
1292
+
1293
+ def test_vec_function_df(self):
1294
+ self.cur.execute('select * from vec_function_df(5, 10)')
1295
+
1296
+ out = list(self.cur)
1297
+
1298
+ assert out == [
1299
+ (1, 1.1),
1300
+ (2, 2.2),
1301
+ (3, 3.3),
1302
+ ]
1303
+
1304
+ desc = self.cur.description
1305
+ assert len(desc) == 2
1306
+ assert desc[0].name == 'res'
1307
+ assert desc[0].type_code == ft.SHORT
1308
+ assert desc[0].null_ok is False
1309
+ assert desc[1].name == 'res2'
1310
+ assert desc[1].type_code == ft.DOUBLE
1311
+ assert desc[1].null_ok is False
1312
+
1313
+ def test_vec_function_ints_masked(self):
1314
+ self.cur.execute('select * from vec_function_ints_masked(5, 10)')
1315
+
1316
+ assert [tuple(x) for x in self.cur] == [(50,)]
1317
+
1318
+ desc = self.cur.description
1319
+ assert len(desc) == 1
1320
+ assert desc[0].name == 'res'
1321
+ assert desc[0].type_code == ft.SHORT
1322
+ assert desc[0].null_ok is True
1323
+
1324
+ self.cur.execute('select * from vec_function_ints_masked(NULL, 10)')
1325
+
1326
+ assert [tuple(x) for x in self.cur] == [(None,)]
1327
+
1328
+ desc = self.cur.description
1329
+ assert len(desc) == 1
1330
+ assert desc[0].name == 'res'
1331
+ assert desc[0].type_code == ft.SHORT
1332
+ assert desc[0].null_ok is True
1333
+
1334
+ self.cur.execute('select * from vec_function_ints_masked(5, NULL)')
1335
+
1336
+ assert [tuple(x) for x in self.cur] == [(None,)]
1337
+
1338
+ desc = self.cur.description
1339
+ assert len(desc) == 1
1340
+ assert desc[0].name == 'res'
1341
+ assert desc[0].type_code == ft.SHORT
1342
+ assert desc[0].null_ok is True
1343
+
1344
+ def test_vec_function_ints_masked2(self):
1345
+ self.cur.execute('select * from vec_function_ints_masked2(5, 10)')
1346
+
1347
+ assert [tuple(x) for x in self.cur] == [(50, 50)]
1348
+
1349
+ desc = self.cur.description
1350
+ assert len(desc) == 2
1351
+ assert desc[0].name == 'res'
1352
+ assert desc[0].type_code == ft.SHORT
1353
+ assert desc[0].null_ok is True
1354
+ assert desc[1].name == 'res2'
1355
+ assert desc[1].type_code == ft.SHORT
1356
+ assert desc[1].null_ok is True
1357
+
1358
+ self.cur.execute('select * from vec_function_ints_masked2(NULL, 10)')
1359
+
1360
+ assert [tuple(x) for x in self.cur] == [(None, None)]
1361
+
1362
+ desc = self.cur.description
1363
+ assert len(desc) == 2
1364
+ assert desc[0].name == 'res'
1365
+ assert desc[0].type_code == ft.SHORT
1366
+ assert desc[0].null_ok is True
1367
+ assert desc[1].name == 'res2'
1368
+ assert desc[1].type_code == ft.SHORT
1369
+ assert desc[1].null_ok is True
1370
+
1371
+ self.cur.execute('select * from vec_function_ints_masked2(5, NULL)')
1372
+
1373
+ assert [tuple(x) for x in self.cur] == [(None, None)]
1374
+
1375
+ desc = self.cur.description
1376
+ assert len(desc) == 2
1377
+ assert desc[0].name == 'res'
1378
+ assert desc[0].type_code == ft.SHORT
1379
+ assert desc[0].null_ok is True
1380
+ assert desc[1].name == 'res2'
1381
+ assert desc[1].type_code == ft.SHORT
1382
+ assert desc[1].null_ok is True
@@ -35,7 +35,7 @@ class TestCluster(unittest.TestCase):
35
35
  cls.manager = s2.manage_cluster()
36
36
 
37
37
  us_regions = [x for x in cls.manager.regions if 'US' in x.name]
38
- cls.password = secrets.token_urlsafe(20) + '-x&'
38
+ cls.password = secrets.token_urlsafe(20) + '-x&$'
39
39
 
40
40
  cls.cluster = cls.manager.create_cluster(
41
41
  clean_name('cm-test-{}'.format(secrets.token_urlsafe(20)[:20])),
@@ -201,7 +201,7 @@ class TestWorkspace(unittest.TestCase):
201
201
  cls.manager = s2.manage_workspaces()
202
202
 
203
203
  us_regions = [x for x in cls.manager.regions if 'US' in x.name]
204
- cls.password = secrets.token_urlsafe(20)
204
+ cls.password = secrets.token_urlsafe(20) + '-x&$'
205
205
 
206
206
  name = clean_name(secrets.token_urlsafe(20)[:20])
207
207
 
@@ -375,7 +375,7 @@ class TestStage(unittest.TestCase):
375
375
  cls.manager = s2.manage_workspaces()
376
376
 
377
377
  us_regions = [x for x in cls.manager.regions if 'US' in x.name]
378
- cls.password = secrets.token_urlsafe(20)
378
+ cls.password = secrets.token_urlsafe(20) + '-x&$'
379
379
 
380
380
  name = clean_name(secrets.token_urlsafe(20)[:20])
381
381
 
@@ -839,7 +839,7 @@ class TestSecrets(unittest.TestCase):
839
839
  cls.manager = s2.manage_workspaces()
840
840
 
841
841
  us_regions = [x for x in cls.manager.regions if 'US' in x.name]
842
- cls.password = secrets.token_urlsafe(20)
842
+ cls.password = secrets.token_urlsafe(20) + '-x&$'
843
843
 
844
844
  name = clean_name(secrets.token_urlsafe(20)[:20])
845
845
 
@@ -898,7 +898,7 @@ class TestJob(unittest.TestCase):
898
898
  cls.manager = s2.manage_workspaces()
899
899
 
900
900
  us_regions = [x for x in cls.manager.regions if 'US' in x.name]
901
- cls.password = secrets.token_urlsafe(20)
901
+ cls.password = secrets.token_urlsafe(20) + '-x&$'
902
902
 
903
903
  name = clean_name(secrets.token_urlsafe(20)[:20])
904
904