singlestoredb 1.12.2__cp38-abi3-macosx_10_9_universal2.whl → 1.12.4__cp38-abi3-macosx_10_9_universal2.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_accel.abi3.so +0 -0
- singlestoredb/__init__.py +1 -1
- singlestoredb/config.py +1 -1
- singlestoredb/functions/ext/asgi.py +20 -3
- singlestoredb/functions/signature.py +8 -1
- singlestoredb/http/connection.py +9 -0
- singlestoredb/mysql/connection.py +17 -11
- singlestoredb/mysql/cursors.py +8 -0
- singlestoredb/tests/test_basics.py +71 -0
- {singlestoredb-1.12.2.dist-info → singlestoredb-1.12.4.dist-info}/METADATA +1 -1
- {singlestoredb-1.12.2.dist-info → singlestoredb-1.12.4.dist-info}/RECORD +15 -15
- {singlestoredb-1.12.2.dist-info → singlestoredb-1.12.4.dist-info}/LICENSE +0 -0
- {singlestoredb-1.12.2.dist-info → singlestoredb-1.12.4.dist-info}/WHEEL +0 -0
- {singlestoredb-1.12.2.dist-info → singlestoredb-1.12.4.dist-info}/entry_points.txt +0 -0
- {singlestoredb-1.12.2.dist-info → singlestoredb-1.12.4.dist-info}/top_level.txt +0 -0
_singlestoredb_accel.abi3.so
CHANGED
|
Binary file
|
singlestoredb/__init__.py
CHANGED
singlestoredb/config.py
CHANGED
|
@@ -69,6 +69,12 @@ try:
|
|
|
69
69
|
except ImportError:
|
|
70
70
|
has_cloudpickle = False
|
|
71
71
|
|
|
72
|
+
try:
|
|
73
|
+
from pydantic import BaseModel
|
|
74
|
+
has_pydantic = True
|
|
75
|
+
except ImportError:
|
|
76
|
+
has_pydantic = False
|
|
77
|
+
|
|
72
78
|
|
|
73
79
|
logger = utils.get_logger('singlestoredb.functions.ext.asgi')
|
|
74
80
|
|
|
@@ -138,13 +144,24 @@ def get_func_names(funcs: str) -> List[Tuple[str, str]]:
|
|
|
138
144
|
|
|
139
145
|
|
|
140
146
|
def as_tuple(x: Any) -> Any:
|
|
141
|
-
|
|
142
|
-
|
|
147
|
+
"""Convert object to tuple."""
|
|
148
|
+
if has_pydantic and isinstance(x, BaseModel):
|
|
149
|
+
return tuple(x.model_dump().values())
|
|
143
150
|
if dataclasses.is_dataclass(x):
|
|
144
151
|
return dataclasses.astuple(x)
|
|
145
152
|
return x
|
|
146
153
|
|
|
147
154
|
|
|
155
|
+
def as_list_of_tuples(x: Any) -> Any:
|
|
156
|
+
"""Convert object to a list of tuples."""
|
|
157
|
+
if isinstance(x, (list, tuple)) and len(x) > 0:
|
|
158
|
+
if has_pydantic and isinstance(x[0], BaseModel):
|
|
159
|
+
return [tuple(y.model_dump().values()) for y in x]
|
|
160
|
+
if dataclasses.is_dataclass(x[0]):
|
|
161
|
+
return [dataclasses.astuple(y) for y in x]
|
|
162
|
+
return x
|
|
163
|
+
|
|
164
|
+
|
|
148
165
|
def make_func(
|
|
149
166
|
name: str,
|
|
150
167
|
func: Callable[..., Any],
|
|
@@ -183,7 +200,7 @@ def make_func(
|
|
|
183
200
|
out_ids: List[int] = []
|
|
184
201
|
out = []
|
|
185
202
|
for i, res in zip(row_ids, func_map(func, rows)):
|
|
186
|
-
out.extend(
|
|
203
|
+
out.extend(as_list_of_tuples(res))
|
|
187
204
|
out_ids.extend([row_ids[i]] * (len(out)-len(out_ids)))
|
|
188
205
|
return out_ids, out
|
|
189
206
|
|
|
@@ -6,6 +6,8 @@ import numbers
|
|
|
6
6
|
import os
|
|
7
7
|
import re
|
|
8
8
|
import string
|
|
9
|
+
import sys
|
|
10
|
+
import types
|
|
9
11
|
import typing
|
|
10
12
|
from typing import Any
|
|
11
13
|
from typing import Callable
|
|
@@ -32,6 +34,11 @@ except ImportError:
|
|
|
32
34
|
from . import dtypes as dt
|
|
33
35
|
from ..mysql.converters import escape_item # type: ignore
|
|
34
36
|
|
|
37
|
+
if sys.version_info >= (3, 10):
|
|
38
|
+
_UNION_TYPES = {typing.Union, types.UnionType}
|
|
39
|
+
else:
|
|
40
|
+
_UNION_TYPES = {typing.Union}
|
|
41
|
+
|
|
35
42
|
|
|
36
43
|
array_types: Tuple[Any, ...]
|
|
37
44
|
|
|
@@ -211,7 +218,7 @@ def simplify_dtype(dtype: Any) -> List[Any]:
|
|
|
211
218
|
args = []
|
|
212
219
|
|
|
213
220
|
# Flatten Unions
|
|
214
|
-
if origin
|
|
221
|
+
if origin in _UNION_TYPES:
|
|
215
222
|
for x in typing.get_args(dtype):
|
|
216
223
|
args.extend(simplify_dtype(x))
|
|
217
224
|
|
singlestoredb/http/connection.py
CHANGED
|
@@ -43,6 +43,12 @@ try:
|
|
|
43
43
|
except ImportError:
|
|
44
44
|
has_shapely = False
|
|
45
45
|
|
|
46
|
+
try:
|
|
47
|
+
import pydantic
|
|
48
|
+
has_pydantic = True
|
|
49
|
+
except ImportError:
|
|
50
|
+
has_pydantic = False
|
|
51
|
+
|
|
46
52
|
from .. import connection
|
|
47
53
|
from .. import fusion
|
|
48
54
|
from .. import types
|
|
@@ -533,6 +539,9 @@ class Cursor(connection.Cursor):
|
|
|
533
539
|
self._expect_results = True
|
|
534
540
|
sql_type = 'query'
|
|
535
541
|
|
|
542
|
+
if has_pydantic and isinstance(params, pydantic.BaseModel):
|
|
543
|
+
params = params.model_dump()
|
|
544
|
+
|
|
536
545
|
self._validate_param_subs(oper, params)
|
|
537
546
|
|
|
538
547
|
handler = fusion.get_handler(oper)
|
|
@@ -989,18 +989,11 @@ class Connection(BaseConnection):
|
|
|
989
989
|
|
|
990
990
|
def set_character_set(self, charset, collation=None):
|
|
991
991
|
"""
|
|
992
|
-
Set
|
|
992
|
+
Set charaset (and collation) on the server.
|
|
993
993
|
|
|
994
|
-
Send "SET
|
|
994
|
+
Send "SET NAMES charset [COLLATE collation]" query.
|
|
995
995
|
Update Connection.encoding based on charset.
|
|
996
996
|
|
|
997
|
-
If charset/collation are being set to utf8mb4, the corresponding global
|
|
998
|
-
variables (COLLATION_SERVER and CHARACTER_SET_SERVER) must be also set
|
|
999
|
-
to utf8mb4. This is true by default for SingleStore 8.7+. For previuous
|
|
1000
|
-
versions or non-default setting user must manully run the query
|
|
1001
|
-
`SET global collation_connection = utf8mb4_general_ci`
|
|
1002
|
-
replacing utf8mb4_general_ci with {collation}.
|
|
1003
|
-
|
|
1004
997
|
Parameters
|
|
1005
998
|
----------
|
|
1006
999
|
charset : str
|
|
@@ -1013,9 +1006,9 @@ class Connection(BaseConnection):
|
|
|
1013
1006
|
encoding = charset_by_name(charset).encoding
|
|
1014
1007
|
|
|
1015
1008
|
if collation:
|
|
1016
|
-
query = f'SET
|
|
1009
|
+
query = f'SET NAMES {charset} COLLATE {collation}'
|
|
1017
1010
|
else:
|
|
1018
|
-
query = f'SET
|
|
1011
|
+
query = f'SET NAMES {charset}'
|
|
1019
1012
|
self._execute_command(COMMAND.COM_QUERY, query)
|
|
1020
1013
|
self._read_packet()
|
|
1021
1014
|
self.charset = charset
|
|
@@ -1119,6 +1112,19 @@ class Connection(BaseConnection):
|
|
|
1119
1112
|
self._get_server_information()
|
|
1120
1113
|
self._request_authentication()
|
|
1121
1114
|
|
|
1115
|
+
# Send "SET NAMES" query on init for:
|
|
1116
|
+
# - Ensure charaset (and collation) is set to the server.
|
|
1117
|
+
# - collation_id in handshake packet may be ignored.
|
|
1118
|
+
# - If collation is not specified, we don't know what is server's
|
|
1119
|
+
# default collation for the charset. For example, default collation
|
|
1120
|
+
# of utf8mb4 is:
|
|
1121
|
+
# - MySQL 5.7, MariaDB 10.x: utf8mb4_general_ci
|
|
1122
|
+
# - MySQL 8.0: utf8mb4_0900_ai_ci
|
|
1123
|
+
#
|
|
1124
|
+
# Reference:
|
|
1125
|
+
# - https://github.com/PyMySQL/PyMySQL/issues/1092
|
|
1126
|
+
# - https://github.com/wagtail/wagtail/issues/9477
|
|
1127
|
+
# - https://zenn.dev/methane/articles/2023-mysql-collation (Japanese)
|
|
1122
1128
|
self.set_character_set(self.charset, self.collation)
|
|
1123
1129
|
|
|
1124
1130
|
if self.sql_mode is not None:
|
singlestoredb/mysql/cursors.py
CHANGED
|
@@ -8,6 +8,12 @@ from ..utils import results
|
|
|
8
8
|
from ..utils.debug import log_query
|
|
9
9
|
from ..utils.results import get_schema
|
|
10
10
|
|
|
11
|
+
try:
|
|
12
|
+
from pydantic import BaseModel
|
|
13
|
+
has_pydantic = True
|
|
14
|
+
except ImportError:
|
|
15
|
+
has_pydantic = False
|
|
16
|
+
|
|
11
17
|
|
|
12
18
|
#: Regular expression for :meth:`Cursor.executemany`.
|
|
13
19
|
#: executemany only supports simple bulk insert.
|
|
@@ -149,6 +155,8 @@ class Cursor(BaseCursor):
|
|
|
149
155
|
return tuple(literal(arg) for arg in args)
|
|
150
156
|
elif dtype is dict or isinstance(args, dict):
|
|
151
157
|
return {key: literal(val) for (key, val) in args.items()}
|
|
158
|
+
elif has_pydantic and isinstance(args, BaseModel):
|
|
159
|
+
return {key: literal(val) for (key, val) in args.model_dump().items()}
|
|
152
160
|
# If it's not a dictionary let's try escaping it anyways.
|
|
153
161
|
# Worst case it will throw a Value error
|
|
154
162
|
return conn.escape(args)
|
|
@@ -6,6 +6,7 @@ import decimal
|
|
|
6
6
|
import math
|
|
7
7
|
import os
|
|
8
8
|
import unittest
|
|
9
|
+
from typing import Optional
|
|
9
10
|
|
|
10
11
|
from requests.exceptions import InvalidJSONError
|
|
11
12
|
|
|
@@ -28,6 +29,12 @@ try:
|
|
|
28
29
|
except ImportError:
|
|
29
30
|
has_pygeos = False
|
|
30
31
|
|
|
32
|
+
try:
|
|
33
|
+
import pydantic
|
|
34
|
+
has_pydantic = True
|
|
35
|
+
except ImportError:
|
|
36
|
+
has_pydantic = False
|
|
37
|
+
|
|
31
38
|
import singlestoredb as s2
|
|
32
39
|
from . import utils
|
|
33
40
|
# import traceback
|
|
@@ -1255,6 +1262,70 @@ class TestBasics(unittest.TestCase):
|
|
|
1255
1262
|
except Exception:
|
|
1256
1263
|
pass
|
|
1257
1264
|
|
|
1265
|
+
def test_pydantic(self):
|
|
1266
|
+
if not has_pydantic:
|
|
1267
|
+
self.skipTest('Test requires pydantic')
|
|
1268
|
+
|
|
1269
|
+
tblname = 'foo_' + str(id(self))
|
|
1270
|
+
|
|
1271
|
+
class FooData(pydantic.BaseModel):
|
|
1272
|
+
x: Optional[int]
|
|
1273
|
+
y: Optional[float]
|
|
1274
|
+
z: Optional[str] = None
|
|
1275
|
+
|
|
1276
|
+
self.cur.execute(f'''
|
|
1277
|
+
CREATE TABLE {tblname}(
|
|
1278
|
+
x INT,
|
|
1279
|
+
y DOUBLE,
|
|
1280
|
+
z TEXT
|
|
1281
|
+
)
|
|
1282
|
+
''')
|
|
1283
|
+
|
|
1284
|
+
self.cur.execute(
|
|
1285
|
+
f'INSERT INTO {tblname}(x, y) VALUES (%(x)s, %(y)s)',
|
|
1286
|
+
FooData(x=2, y=3.23),
|
|
1287
|
+
)
|
|
1288
|
+
|
|
1289
|
+
self.cur.execute('SELECT * FROM ' + tblname)
|
|
1290
|
+
|
|
1291
|
+
assert list(sorted(self.cur.fetchall())) == \
|
|
1292
|
+
list(sorted([(2, 3.23, None)]))
|
|
1293
|
+
|
|
1294
|
+
self.cur.executemany(
|
|
1295
|
+
f'INSERT INTO {tblname}(x) VALUES (%(x)s)',
|
|
1296
|
+
[FooData(x=3, y=3.12), FooData(x=10, y=100.11)],
|
|
1297
|
+
)
|
|
1298
|
+
|
|
1299
|
+
self.cur.execute('SELECT * FROM ' + tblname)
|
|
1300
|
+
|
|
1301
|
+
assert list(sorted(self.cur.fetchall())) == \
|
|
1302
|
+
list(
|
|
1303
|
+
sorted([
|
|
1304
|
+
(2, 3.23, None),
|
|
1305
|
+
(3, None, None),
|
|
1306
|
+
(10, None, None),
|
|
1307
|
+
]),
|
|
1308
|
+
)
|
|
1309
|
+
|
|
1310
|
+
def test_charset(self):
|
|
1311
|
+
self.skipTest('Skip until charset commands are re-implemented')
|
|
1312
|
+
|
|
1313
|
+
with s2.connect(database=type(self).dbname) as conn:
|
|
1314
|
+
with conn.cursor() as cur:
|
|
1315
|
+
cur.execute('''
|
|
1316
|
+
select json_extract_string('{"foo":"😀"}', "bar");
|
|
1317
|
+
''')
|
|
1318
|
+
|
|
1319
|
+
if 'http' in self.conn.driver:
|
|
1320
|
+
self.skipTest('Charset is not use in HTTP interface')
|
|
1321
|
+
|
|
1322
|
+
with self.assertRaises(s2.OperationalError):
|
|
1323
|
+
with s2.connect(database=type(self).dbname, charset='utf8') as conn:
|
|
1324
|
+
with conn.cursor() as cur:
|
|
1325
|
+
cur.execute('''
|
|
1326
|
+
select json_extract_string('{"foo":"😀"}', "bar");
|
|
1327
|
+
''')
|
|
1328
|
+
|
|
1258
1329
|
|
|
1259
1330
|
if __name__ == '__main__':
|
|
1260
1331
|
import nose2
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
_singlestoredb_accel.abi3.so,sha256=
|
|
2
|
-
singlestoredb-1.12.
|
|
3
|
-
singlestoredb-1.12.
|
|
4
|
-
singlestoredb-1.12.
|
|
5
|
-
singlestoredb-1.12.
|
|
6
|
-
singlestoredb-1.12.
|
|
7
|
-
singlestoredb-1.12.
|
|
1
|
+
_singlestoredb_accel.abi3.so,sha256=xY1c5vTEUfKIji9QcD3fQ_saMVbafbIszYKY7i9yfzo,206864
|
|
2
|
+
singlestoredb-1.12.4.dist-info/RECORD,,
|
|
3
|
+
singlestoredb-1.12.4.dist-info/LICENSE,sha256=Mlq78idURT-9G026aMYswwwnnrLcgzTLuXeAs5hjDLM,11341
|
|
4
|
+
singlestoredb-1.12.4.dist-info/WHEEL,sha256=_VEguvlLpUd-c8RbFMA4yMIVNMBv2LhpxYLCEQ-Bogk,113
|
|
5
|
+
singlestoredb-1.12.4.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
|
|
6
|
+
singlestoredb-1.12.4.dist-info/top_level.txt,sha256=lA65Vf4qAMfg_s1oG3LEO90h4t1Z-SPDbRqkevI3bSY,40
|
|
7
|
+
singlestoredb-1.12.4.dist-info/METADATA,sha256=yw18Su4O69FjG3sYf5-SSdTQsiMhZiIa2fcGK2S4Vrs,5636
|
|
8
8
|
sqlx/magic.py,sha256=JsS9_9aBFaOt91Torm1JPN0c8qB2QmYJmNSKtbSQIY0,3509
|
|
9
9
|
sqlx/__init__.py,sha256=aBYiU8DZXCogvWu3yWafOz7bZS5WWwLZXj7oL0dXGyU,85
|
|
10
10
|
singlestoredb/auth.py,sha256=u8D9tpKzrqa4ssaHjyZnGDX1q8XBpGtuoOkTkSv7B28,7599
|
|
11
|
-
singlestoredb/config.py,sha256=
|
|
12
|
-
singlestoredb/__init__.py,sha256=
|
|
11
|
+
singlestoredb/config.py,sha256=0XooNOf1dUee26C0io7unfBbdXUyfDIYc_mSpxsVsTI,12592
|
|
12
|
+
singlestoredb/__init__.py,sha256=k2RhlWhHq2KGERDJKr9bjgAV5KCrLJl2vcEyfWJriGw,1649
|
|
13
13
|
singlestoredb/types.py,sha256=FIqO1A7e0Gkk7ITmIysBy-P5S--ItbMSlYvblzqGS30,9969
|
|
14
14
|
singlestoredb/connection.py,sha256=0HEpjBZXLqQwOTEfveMkgej1H3Kyof47prIHvJJZtoo,45831
|
|
15
15
|
singlestoredb/pytest.py,sha256=OyF3BO9mgxenifYhOihnzGk8WzCJ_zN5_mxe8XyFPOc,9074
|
|
@@ -34,7 +34,7 @@ singlestoredb/tests/test_xdict.py,sha256=fqHspoi39nbX3fIDVkkRXcd5H50xdOsSvK0bxAM
|
|
|
34
34
|
singlestoredb/tests/test_results.py,sha256=wg93sujwt-R9_eJCgSCElgAZhLDkIiAo3qPkPydOv78,6582
|
|
35
35
|
singlestoredb/tests/test_fusion.py,sha256=EH1mRwdX2Fajsq6x2l0gBhH1YhcxtvDGIKC9HJ4sDbQ,50521
|
|
36
36
|
singlestoredb/tests/test_plugin.py,sha256=qpO9wmWc62VaijN1sJ97YSYIX7I7Y5C6sY-WzwrutDQ,812
|
|
37
|
-
singlestoredb/tests/test_basics.py,sha256=
|
|
37
|
+
singlestoredb/tests/test_basics.py,sha256=Dw1irrtf3gWN7tqGruSH6uhWi5zkmCpJl6ZMQxMqlf4,48446
|
|
38
38
|
singlestoredb/tests/test_ext_func.py,sha256=OWd-CJ1Owhx72nikSWWEF2EQFCJk7vEXZM2Oy9EbYQo,37357
|
|
39
39
|
singlestoredb/tests/test_connection.py,sha256=fvn-kPdeIMI9RGNz0dNk5ZmTCep1amwWQDHYfPdqO60,119699
|
|
40
40
|
singlestoredb/tests/test2.ipynb,sha256=yd1PE1VK-DwiRd6mYS4_0cPBtuVkvcDtycvTwD-YnDo,218
|
|
@@ -80,14 +80,14 @@ singlestoredb/utils/xdict.py,sha256=S9HKgrPrnu_6b7iOwa2KrW8CmU1Uqx0BWdEyogFzWbE,
|
|
|
80
80
|
singlestoredb/utils/debug.py,sha256=0JiLA37u_9CKiDGiN9BK_PtFMUku3vIcNjERWaTNRSU,349
|
|
81
81
|
singlestoredb/utils/mogrify.py,sha256=-a56IF70U6CkfadeaZgfjRSVsAD3PuqRrzPpjZlgbwY,4050
|
|
82
82
|
singlestoredb/http/__init__.py,sha256=A_2ZUCCpvRYIA6YDpPy57wL5R1eZ5SfP6I1To5nfJ2s,912
|
|
83
|
-
singlestoredb/http/connection.py,sha256=
|
|
83
|
+
singlestoredb/http/connection.py,sha256=dNn6OAjCSueR_CIv1T28oDr_TkqXUV05yv1t-XoPrYE,39814
|
|
84
84
|
singlestoredb/ai/__init__.py,sha256=7Pubobzx5OlyepNo5DOOxWev1DUW9WFc9P6Qver2xpY,60
|
|
85
85
|
singlestoredb/ai/embeddings.py,sha256=3jghE4WMf7vy8RobhrMOLvMLnDNGbkPCF48B3fGM38U,746
|
|
86
86
|
singlestoredb/mysql/protocol.py,sha256=2GG8qTXy5npqo7z2D2K5T0S8PtoUOS-hFDEXy8VConw,14451
|
|
87
|
-
singlestoredb/mysql/cursors.py,sha256=
|
|
87
|
+
singlestoredb/mysql/cursors.py,sha256=aOLfHkj83aYZPOVuhJPkZ83CWByszIBRynq0fqSaWvY,27046
|
|
88
88
|
singlestoredb/mysql/__init__.py,sha256=olUTAvkiERhDW41JXQMawkg-i0tvBEkoTkII1tt6lxU,4492
|
|
89
89
|
singlestoredb/mysql/times.py,sha256=2j7purNVnJmjhOUgwUze-r3kNlCWqxjXj-jtqOzBfZI,463
|
|
90
|
-
singlestoredb/mysql/connection.py,sha256=
|
|
90
|
+
singlestoredb/mysql/connection.py,sha256=6WlhOF-oEoF7V4bl4MTxU6qr6H15-KZvPC-snPmbXVg,73355
|
|
91
91
|
singlestoredb/mysql/charset.py,sha256=-FlONDS_oAUF5B3mIgeHBPb_SCt4zHD33arUeBNctU0,10510
|
|
92
92
|
singlestoredb/mysql/converters.py,sha256=CVe8SDmjbIAhy1xpQ2N5OKWw6t5eWpw-EU3QTlA0Hh0,7500
|
|
93
93
|
singlestoredb/mysql/optionfile.py,sha256=DqL-rOQcqQncD5eVbPRkwZqo7Pj3Vh40VLx3E_e87TU,655
|
|
@@ -127,8 +127,8 @@ singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py,s
|
|
|
127
127
|
singlestoredb/functions/decorator.py,sha256=0gfYVCi_GvxKcuDmAcpfIFTTElLD0CBT8RYN_dUrEvU,11485
|
|
128
128
|
singlestoredb/functions/__init__.py,sha256=nPaLVgtb5XDxbRucDFFwjePPh4n40_6jcbxE8HPebkQ,82
|
|
129
129
|
singlestoredb/functions/dtypes.py,sha256=a2vevIug8NhiUCFiSOKwRPpdWU69Gn13ZoQ6Aovskhc,31408
|
|
130
|
-
singlestoredb/functions/signature.py,sha256=
|
|
131
|
-
singlestoredb/functions/ext/asgi.py,sha256=
|
|
130
|
+
singlestoredb/functions/signature.py,sha256=qjdCBxtJvNnDWCAruX9kFNuYuGYVCWGEJ-heKRu4MXk,22551
|
|
131
|
+
singlestoredb/functions/ext/asgi.py,sha256=AK7dxe_m8TnFh7IuKKzKO1lCyfJVzs4hRJKW1vTO130,44073
|
|
132
132
|
singlestoredb/functions/ext/arrow.py,sha256=WB7n1ACslyd8nlbFzUvlbxn1BVuEjA9-BGBEqCWlSOo,9061
|
|
133
133
|
singlestoredb/functions/ext/__init__.py,sha256=1oLL20yLB1GL9IbFiZD8OReDqiCpFr-yetIR6x1cNkI,23
|
|
134
134
|
singlestoredb/functions/ext/utils.py,sha256=2-B8YU_Iekv8JcpI-ochs9TIeuyatLaLAH-AyYyUUIg,5311
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|