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.
- singlestoredb/__init__.py +1 -1
- singlestoredb/ai/__init__.py +1 -0
- singlestoredb/ai/chat.py +26 -0
- singlestoredb/ai/embeddings.py +18 -15
- singlestoredb/apps/__init__.py +1 -0
- singlestoredb/apps/_config.py +6 -0
- singlestoredb/apps/_connection_info.py +8 -0
- singlestoredb/apps/_python_udfs.py +85 -0
- singlestoredb/config.py +14 -2
- singlestoredb/functions/__init__.py +15 -1
- singlestoredb/functions/decorator.py +102 -252
- singlestoredb/functions/dtypes.py +545 -198
- singlestoredb/functions/ext/asgi.py +421 -129
- singlestoredb/functions/ext/json.py +29 -36
- singlestoredb/functions/ext/mmap.py +1 -1
- singlestoredb/functions/ext/rowdat_1.py +50 -70
- singlestoredb/functions/signature.py +816 -144
- singlestoredb/functions/typing.py +41 -0
- singlestoredb/functions/utils.py +421 -0
- singlestoredb/http/connection.py +3 -1
- singlestoredb/management/inference_api.py +101 -0
- singlestoredb/management/manager.py +6 -1
- singlestoredb/management/organization.py +17 -0
- singlestoredb/management/utils.py +2 -2
- singlestoredb/tests/ext_funcs/__init__.py +476 -237
- singlestoredb/tests/test_ext_func.py +192 -3
- singlestoredb/tests/test_management.py +5 -5
- singlestoredb/tests/test_udf.py +101 -131
- singlestoredb/tests/test_udf_returns.py +459 -0
- {singlestoredb-1.12.4.dist-info → singlestoredb-1.13.1.dist-info}/METADATA +2 -1
- {singlestoredb-1.12.4.dist-info → singlestoredb-1.13.1.dist-info}/RECORD +35 -29
- {singlestoredb-1.12.4.dist-info → singlestoredb-1.13.1.dist-info}/LICENSE +0 -0
- {singlestoredb-1.12.4.dist-info → singlestoredb-1.13.1.dist-info}/WHEEL +0 -0
- {singlestoredb-1.12.4.dist-info → singlestoredb-1.13.1.dist-info}/entry_points.txt +0 -0
- {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,), (
|
|
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
|
|
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
|
|
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
|
|