singlestoredb 1.1.0__py3-none-any.whl → 1.3.0__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 (31) hide show
  1. singlestoredb/__init__.py +1 -1
  2. singlestoredb/config.py +6 -0
  3. singlestoredb/connection.py +23 -1
  4. singlestoredb/converters.py +390 -0
  5. singlestoredb/functions/ext/asgi.py +7 -1
  6. singlestoredb/fusion/handler.py +14 -8
  7. singlestoredb/fusion/handlers/stage.py +167 -84
  8. singlestoredb/fusion/handlers/workspace.py +250 -108
  9. singlestoredb/fusion/registry.py +27 -10
  10. singlestoredb/http/connection.py +18 -1
  11. singlestoredb/management/__init__.py +1 -0
  12. singlestoredb/management/organization.py +4 -0
  13. singlestoredb/management/utils.py +2 -2
  14. singlestoredb/management/workspace.py +79 -6
  15. singlestoredb/mysql/connection.py +92 -16
  16. singlestoredb/mysql/constants/EXTENDED_TYPE.py +3 -0
  17. singlestoredb/mysql/constants/FIELD_TYPE.py +16 -0
  18. singlestoredb/mysql/constants/VECTOR_TYPE.py +6 -0
  19. singlestoredb/mysql/cursors.py +13 -10
  20. singlestoredb/mysql/protocol.py +50 -1
  21. singlestoredb/notebook/__init__.py +15 -0
  22. singlestoredb/notebook/_objects.py +212 -0
  23. singlestoredb/tests/test.sql +49 -0
  24. singlestoredb/tests/test_connection.py +174 -0
  25. singlestoredb/utils/results.py +5 -1
  26. {singlestoredb-1.1.0.dist-info → singlestoredb-1.3.0.dist-info}/METADATA +1 -1
  27. {singlestoredb-1.1.0.dist-info → singlestoredb-1.3.0.dist-info}/RECORD +31 -27
  28. {singlestoredb-1.1.0.dist-info → singlestoredb-1.3.0.dist-info}/LICENSE +0 -0
  29. {singlestoredb-1.1.0.dist-info → singlestoredb-1.3.0.dist-info}/WHEEL +0 -0
  30. {singlestoredb-1.1.0.dist-info → singlestoredb-1.3.0.dist-info}/entry_points.txt +0 -0
  31. {singlestoredb-1.1.0.dist-info → singlestoredb-1.3.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,212 @@
1
+ #!/usr/bin/env python
2
+ import functools
3
+ from typing import Any
4
+
5
+ from ..management import workspace as _ws
6
+
7
+
8
+ class Secrets(object):
9
+ """Wrapper for accessing secrets as object attributes."""
10
+
11
+ def __getattr__(self, name: str) -> str:
12
+ if name.startswith('_ipython') or name.startswith('_repr_'):
13
+ raise AttributeError(name)
14
+ return _ws.get_secret(name)
15
+
16
+ def __getitem__(self, name: str) -> str:
17
+ return _ws.get_secret(name)
18
+
19
+
20
+ class Stage(object):
21
+
22
+ def __new__(cls, *args: Any, **kwargs: Any) -> Any:
23
+ # We are remapping the methods and attributes here so that
24
+ # autocomplete still works in Jupyter / IPython, but we
25
+ # bypass the real method / attribute calls and apply them
26
+ # to the currently selected stage.
27
+ for name in [x for x in dir(_ws.Stage) if not x.startswith('_')]:
28
+ if name in ['from_dict', 'refresh', 'update']:
29
+ continue
30
+ attr = getattr(_ws.Stage, name)
31
+
32
+ def make_wrapper(m: str, is_method: bool = False) -> Any:
33
+ if is_method:
34
+ def wrap(self: Stage, *a: Any, **kw: Any) -> Any:
35
+ return getattr(_ws.get_stage(), m)(*a, **kw)
36
+ return functools.update_wrapper(wrap, attr)
37
+ else:
38
+ def wrap(self: Stage, *a: Any, **kw: Any) -> Any:
39
+ return getattr(_ws.get_stage(), m)
40
+ return property(functools.update_wrapper(wrap, attr))
41
+
42
+ setattr(cls, name, make_wrapper(m=name, is_method=callable(attr)))
43
+
44
+ for name in [
45
+ x for x in _ws.Stage.__annotations__.keys()
46
+ if not x.startswith('_')
47
+ ]:
48
+
49
+ def make_wrapper(m: str, is_method: bool = False) -> Any:
50
+ def wrap(self: Stage) -> Any:
51
+ return getattr(_ws.get_stage(), m)
52
+ return property(functools.update_wrapper(wrap, attr))
53
+
54
+ setattr(cls, name, make_wrapper(m=name))
55
+
56
+ cls.__doc__ = _ws.Stage.__doc__
57
+
58
+ return super().__new__(cls, *args, **kwargs)
59
+
60
+
61
+ class WorkspaceGroup(object):
62
+
63
+ def __new__(cls, *args: Any, **kwargs: Any) -> Any:
64
+ # We are remapping the methods and attributes here so that
65
+ # autocomplete still works in Jupyter / IPython, but we
66
+ # bypass the real method / attribute calls and apply them
67
+ # to the currently selected workspace group.
68
+ for name in [x for x in dir(_ws.WorkspaceGroup) if not x.startswith('_')]:
69
+ if name in ['from_dict', 'refresh', 'update']:
70
+ continue
71
+
72
+ attr = getattr(_ws.WorkspaceGroup, name)
73
+
74
+ def make_wrapper(m: str, is_method: bool = False) -> Any:
75
+ if is_method:
76
+ def wrap(self: WorkspaceGroup, *a: Any, **kw: Any) -> Any:
77
+ return getattr(_ws.get_workspace_group(), m)(*a, **kw)
78
+ return functools.update_wrapper(wrap, attr)
79
+ else:
80
+ def wrap(self: WorkspaceGroup, *a: Any, **kw: Any) -> Any:
81
+ return getattr(_ws.get_workspace_group(), m)
82
+ return property(functools.update_wrapper(wrap, attr))
83
+
84
+ setattr(cls, name, make_wrapper(m=name, is_method=callable(attr)))
85
+
86
+ for name in [
87
+ x for x in _ws.WorkspaceGroup.__annotations__.keys()
88
+ if not x.startswith('_')
89
+ ]:
90
+
91
+ def make_wrapper(m: str, is_method: bool = False) -> Any:
92
+ def wrap(self: WorkspaceGroup) -> Any:
93
+ return getattr(_ws.get_workspace_group(), m)
94
+ return property(functools.update_wrapper(wrap, attr))
95
+
96
+ setattr(cls, name, make_wrapper(m=name))
97
+
98
+ cls.__doc__ = _ws.WorkspaceGroup.__doc__
99
+
100
+ return super().__new__(cls, *args, **kwargs)
101
+
102
+ def __str__(self) -> str:
103
+ return _ws.get_workspace_group().__str__()
104
+
105
+ def __repr__(self) -> str:
106
+ return _ws.get_workspace_group().__repr__()
107
+
108
+
109
+ class Workspace(object):
110
+
111
+ def __new__(cls, *args: Any, **kwargs: Any) -> Any:
112
+ # We are remapping the methods and attributes here so that
113
+ # autocomplete still works in Jupyter / IPython, but we
114
+ # bypass the real method / attribute calls and apply them
115
+ # to the currently selected workspace.
116
+ for name in [x for x in dir(_ws.Workspace) if not x.startswith('_')]:
117
+ if name in ['from_dict', 'refresh', 'update']:
118
+ continue
119
+
120
+ attr = getattr(_ws.Workspace, name)
121
+
122
+ def make_wrapper(m: str, is_method: bool = False) -> Any:
123
+ if is_method:
124
+ def wrap(self: Workspace, *a: Any, **kw: Any) -> Any:
125
+ return getattr(_ws.get_workspace(), m)(*a, **kw)
126
+ return functools.update_wrapper(wrap, attr)
127
+ else:
128
+ def wrap(self: Workspace, *a: Any, **kw: Any) -> Any:
129
+ return getattr(_ws.get_workspace(), m)
130
+ return property(functools.update_wrapper(wrap, attr))
131
+
132
+ setattr(cls, name, make_wrapper(m=name, is_method=callable(attr)))
133
+
134
+ for name in [
135
+ x for x in _ws.Workspace.__annotations__.keys()
136
+ if not x.startswith('_')
137
+ ]:
138
+
139
+ def make_wrapper(m: str, is_method: bool = False) -> Any:
140
+ def wrap(self: Workspace) -> Any:
141
+ return getattr(_ws.get_workspace(), m)
142
+ return property(functools.update_wrapper(wrap, attr))
143
+
144
+ setattr(cls, name, make_wrapper(m=name))
145
+
146
+ cls.__doc__ = _ws.Workspace.__doc__
147
+
148
+ return super().__new__(cls, *args, **kwargs)
149
+
150
+ def __str__(self) -> str:
151
+ return _ws.get_workspace().__str__()
152
+
153
+ def __repr__(self) -> str:
154
+ return _ws.get_workspace().__repr__()
155
+
156
+
157
+ class Organization(object):
158
+
159
+ def __new__(cls, *args: Any, **kwargs: Any) -> Any:
160
+ # We are remapping the methods and attributes here so that
161
+ # autocomplete still works in Jupyter / IPython, but we
162
+ # bypass the real method / attribute calls and apply them
163
+ # to the currently selected organization.
164
+ for name in [x for x in dir(_ws.Organization) if not x.startswith('_')]:
165
+ if name in ['from_dict', 'refresh', 'update']:
166
+ continue
167
+
168
+ attr = getattr(_ws.Organization, name)
169
+
170
+ def make_wrapper(m: str, is_method: bool = False) -> Any:
171
+ if is_method:
172
+ def wrap(self: Organization, *a: Any, **kw: Any) -> Any:
173
+ return getattr(_ws.get_organization(), m)(*a, **kw)
174
+ return functools.update_wrapper(wrap, attr)
175
+ else:
176
+ def wrap(self: Organization, *a: Any, **kw: Any) -> Any:
177
+ return getattr(_ws.get_organization(), m)
178
+ return property(functools.update_wrapper(wrap, attr))
179
+
180
+ setattr(cls, name, make_wrapper(m=name, is_method=callable(attr)))
181
+
182
+ for name in [
183
+ x for x in _ws.Organization.__annotations__.keys()
184
+ if not x.startswith('_')
185
+ ]:
186
+
187
+ def make_wrapper(m: str, is_method: bool = False) -> Any:
188
+ def wrap(self: Organization) -> Any:
189
+ return getattr(_ws.get_organization(), m)
190
+ return property(functools.update_wrapper(wrap, attr))
191
+
192
+ setattr(cls, name, make_wrapper(m=name))
193
+
194
+ cls.__doc__ = _ws.Organization.__doc__
195
+
196
+ return super().__new__(cls, *args, **kwargs)
197
+
198
+ def __str__(self) -> str:
199
+ return _ws.get_organization().__str__()
200
+
201
+ def __repr__(self) -> str:
202
+ return _ws.get_organization().__repr__()
203
+
204
+
205
+ secrets = Secrets()
206
+ stage = Stage()
207
+ organization = Organization()
208
+ workspace_group = WorkspaceGroup()
209
+ workspace = Workspace()
210
+
211
+
212
+ __all__ = ['secrets', 'stage', 'workspace', 'workspace_group', 'organization']
@@ -606,4 +606,53 @@ INSERT INTO `badutf8` VALUES ('🥷🧙👻.eth');
606
606
  INSERT INTO `badutf8` VALUES ('🥒rick.eth');
607
607
 
608
608
 
609
+ CREATE TABLE IF NOT EXISTS `f32_vectors` (
610
+ id INT(11),
611
+ a VECTOR(3)
612
+ );
613
+ INSERT INTO f32_vectors VALUES(1, '[0.267261237,0.534522474,0.801783681]');
614
+ INSERT INTO f32_vectors VALUES(2, '[0.371390671,0.557085991,0.742781341]');
615
+ INSERT INTO f32_vectors VALUES(3, '[-0.424264073,-0.565685451,0.707106829]');
616
+
617
+ CREATE TABLE IF NOT EXISTS `f64_vectors` (
618
+ id INT(11),
619
+ a VECTOR(3, F64)
620
+ );
621
+ INSERT INTO f64_vectors VALUES(1, '[0.267261237,0.534522474,0.801783681]');
622
+ INSERT INTO f64_vectors VALUES(2, '[0.371390671,0.557085991,0.742781341]');
623
+ INSERT INTO f64_vectors VALUES(3, '[-0.424264073,-0.565685451,0.707106829]');
624
+
625
+ CREATE TABLE `i8_vectors` (
626
+ id INT(11),
627
+ a VECTOR(3, I8)
628
+ );
629
+ INSERT INTO i8_vectors VALUES(1, '[1, 2, 3]');
630
+ INSERT INTO i8_vectors VALUES(2, '[4, 5, 6]');
631
+ INSERT INTO i8_vectors VALUES(3, '[-1, -4, 8]');
632
+
633
+ CREATE TABLE `i16_vectors` (
634
+ id INT(11),
635
+ a VECTOR(3, I16)
636
+ );
637
+ INSERT INTO i16_vectors VALUES(1, '[1, 2, 3]');
638
+ INSERT INTO i16_vectors VALUES(2, '[4, 5, 6]');
639
+ INSERT INTO i16_vectors VALUES(3, '[-1, -4, 8]');
640
+
641
+ CREATE TABLE `i32_vectors` (
642
+ id INT(11),
643
+ a VECTOR(3, I32)
644
+ );
645
+ INSERT INTO i32_vectors VALUES(1, '[1, 2, 3]');
646
+ INSERT INTO i32_vectors VALUES(2, '[4, 5, 6]');
647
+ INSERT INTO i32_vectors VALUES(3, '[-1, -4, 8]');
648
+
649
+ CREATE TABLE `i64_vectors` (
650
+ id INT(11),
651
+ a VECTOR(3, I64)
652
+ );
653
+ INSERT INTO i64_vectors VALUES(1, '[1, 2, 3]');
654
+ INSERT INTO i64_vectors VALUES(2, '[4, 5, 6]');
655
+ INSERT INTO i64_vectors VALUES(3, '[-1, -4, 8]');
656
+
657
+
609
658
  COMMIT;
@@ -2876,6 +2876,180 @@ class TestConnection(unittest.TestCase):
2876
2876
 
2877
2877
  # out = self.conn.show.create_view('vname')
2878
2878
 
2879
+ def test_f32_vectors(self):
2880
+ if self.conn.driver in ['http', 'https']:
2881
+ self.skipTest('Data API does not surface vector information')
2882
+
2883
+ self.cur.execute('show variables like "enable_extended_types_metadata"')
2884
+ out = list(self.cur)
2885
+ if not out or out[0][1].lower() == 'off':
2886
+ self.skipTest('Database engine does not support extended types metadata')
2887
+
2888
+ self.cur.execute('select a from f32_vectors order by id')
2889
+ out = list(self.cur)
2890
+
2891
+ assert out[0][0].dtype is np.dtype('float32')
2892
+ assert out[1][0].dtype is np.dtype('float32')
2893
+ assert out[2][0].dtype is np.dtype('float32')
2894
+
2895
+ np.testing.assert_array_equal(
2896
+ out[0][0],
2897
+ np.array([0.267261237, 0.534522474, 0.801783681], dtype=np.float32),
2898
+ )
2899
+ np.testing.assert_array_equal(
2900
+ out[1][0],
2901
+ np.array([0.371390671, 0.557085991, 0.742781341], dtype=np.float32),
2902
+ )
2903
+ np.testing.assert_array_equal(
2904
+ out[2][0],
2905
+ np.array([-0.424264073, -0.565685451, 0.707106829], dtype=np.float32),
2906
+ )
2907
+
2908
+ def test_f64_vectors(self):
2909
+ if self.conn.driver in ['http', 'https']:
2910
+ self.skipTest('Data API does not surface vector information')
2911
+
2912
+ self.cur.execute('show variables like "enable_extended_types_metadata"')
2913
+ out = list(self.cur)
2914
+ if not out or out[0][1].lower() == 'off':
2915
+ self.skipTest('Database engine does not support extended types metadata')
2916
+
2917
+ self.cur.execute('select a from f64_vectors order by id')
2918
+ out = list(self.cur)
2919
+
2920
+ assert out[0][0].dtype is np.dtype('float64')
2921
+ assert out[1][0].dtype is np.dtype('float64')
2922
+ assert out[2][0].dtype is np.dtype('float64')
2923
+
2924
+ np.testing.assert_array_equal(
2925
+ out[0][0],
2926
+ np.array([0.267261237, 0.534522474, 0.801783681], dtype=np.float64),
2927
+ )
2928
+ np.testing.assert_array_equal(
2929
+ out[1][0],
2930
+ np.array([0.371390671, 0.557085991, 0.742781341], dtype=np.float64),
2931
+ )
2932
+ np.testing.assert_array_equal(
2933
+ out[2][0],
2934
+ np.array([-0.424264073, -0.565685451, 0.707106829], dtype=np.float64),
2935
+ )
2936
+
2937
+ def test_i8_vectors(self):
2938
+ if self.conn.driver in ['http', 'https']:
2939
+ self.skipTest('Data API does not surface vector information')
2940
+
2941
+ self.cur.execute('show variables like "enable_extended_types_metadata"')
2942
+ out = list(self.cur)
2943
+ if not out or out[0][1].lower() == 'off':
2944
+ self.skipTest('Database engine does not support extended types metadata')
2945
+
2946
+ self.cur.execute('select a from i8_vectors order by id')
2947
+ out = list(self.cur)
2948
+
2949
+ assert out[0][0].dtype is np.dtype('int8')
2950
+ assert out[1][0].dtype is np.dtype('int8')
2951
+ assert out[2][0].dtype is np.dtype('int8')
2952
+
2953
+ np.testing.assert_array_equal(
2954
+ out[0][0],
2955
+ np.array([1, 2, 3], dtype=np.int8),
2956
+ )
2957
+ np.testing.assert_array_equal(
2958
+ out[1][0],
2959
+ np.array([4, 5, 6], dtype=np.int8),
2960
+ )
2961
+ np.testing.assert_array_equal(
2962
+ out[2][0],
2963
+ np.array([-1, -4, 8], dtype=np.int8),
2964
+ )
2965
+
2966
+ def test_i16_vectors(self):
2967
+ if self.conn.driver in ['http', 'https']:
2968
+ self.skipTest('Data API does not surface vector information')
2969
+
2970
+ self.cur.execute('show variables like "enable_extended_types_metadata"')
2971
+ out = list(self.cur)
2972
+ if not out or out[0][1].lower() == 'off':
2973
+ self.skipTest('Database engine does not support extended types metadata')
2974
+
2975
+ self.cur.execute('select a from i16_vectors order by id')
2976
+ out = list(self.cur)
2977
+
2978
+ assert out[0][0].dtype is np.dtype('int16')
2979
+ assert out[1][0].dtype is np.dtype('int16')
2980
+ assert out[2][0].dtype is np.dtype('int16')
2981
+
2982
+ np.testing.assert_array_equal(
2983
+ out[0][0],
2984
+ np.array([1, 2, 3], dtype=np.int16),
2985
+ )
2986
+ np.testing.assert_array_equal(
2987
+ out[1][0],
2988
+ np.array([4, 5, 6], dtype=np.int16),
2989
+ )
2990
+ np.testing.assert_array_equal(
2991
+ out[2][0],
2992
+ np.array([-1, -4, 8], dtype=np.int16),
2993
+ )
2994
+
2995
+ def test_i32_vectors(self):
2996
+ if self.conn.driver in ['http', 'https']:
2997
+ self.skipTest('Data API does not surface vector information')
2998
+
2999
+ self.cur.execute('show variables like "enable_extended_types_metadata"')
3000
+ out = list(self.cur)
3001
+ if not out or out[0][1].lower() == 'off':
3002
+ self.skipTest('Database engine does not support extended types metadata')
3003
+
3004
+ self.cur.execute('select a from i32_vectors order by id')
3005
+ out = list(self.cur)
3006
+
3007
+ assert out[0][0].dtype is np.dtype('int32')
3008
+ assert out[1][0].dtype is np.dtype('int32')
3009
+ assert out[2][0].dtype is np.dtype('int32')
3010
+
3011
+ np.testing.assert_array_equal(
3012
+ out[0][0],
3013
+ np.array([1, 2, 3], dtype=np.int32),
3014
+ )
3015
+ np.testing.assert_array_equal(
3016
+ out[1][0],
3017
+ np.array([4, 5, 6], dtype=np.int32),
3018
+ )
3019
+ np.testing.assert_array_equal(
3020
+ out[2][0],
3021
+ np.array([-1, -4, 8], dtype=np.int32),
3022
+ )
3023
+
3024
+ def test_i64_vectors(self):
3025
+ if self.conn.driver in ['http', 'https']:
3026
+ self.skipTest('Data API does not surface vector information')
3027
+
3028
+ self.cur.execute('show variables like "enable_extended_types_metadata"')
3029
+ out = list(self.cur)
3030
+ if not out or out[0][1].lower() == 'off':
3031
+ self.skipTest('Database engine does not support extended types metadata')
3032
+
3033
+ self.cur.execute('select a from i64_vectors order by id')
3034
+ out = list(self.cur)
3035
+
3036
+ assert out[0][0].dtype is np.dtype('int64')
3037
+ assert out[1][0].dtype is np.dtype('int64')
3038
+ assert out[2][0].dtype is np.dtype('int64')
3039
+
3040
+ np.testing.assert_array_equal(
3041
+ out[0][0],
3042
+ np.array([1, 2, 3], dtype=np.int64),
3043
+ )
3044
+ np.testing.assert_array_equal(
3045
+ out[1][0],
3046
+ np.array([4, 5, 6], dtype=np.int64),
3047
+ )
3048
+ np.testing.assert_array_equal(
3049
+ out[2][0],
3050
+ np.array([-1, -4, 8], dtype=np.int64),
3051
+ )
3052
+
2879
3053
 
2880
3054
  if __name__ == '__main__':
2881
3055
  import nose2
@@ -515,6 +515,8 @@ _schema_converters: Dict[
515
515
  'namedtuples': _no_schema,
516
516
  'dict': _no_schema,
517
517
  'dicts': _no_schema,
518
+ 'structsequence': _no_schema,
519
+ 'structsequences': _no_schema,
518
520
  'numpy': _description_to_numpy_schema,
519
521
  'pandas': _description_to_numpy_schema,
520
522
  'polars': _description_to_polars_schema,
@@ -578,4 +580,6 @@ def get_schema(
578
580
  for the given format type
579
581
 
580
582
  """
581
- return _schema_converters[format](desc) or {}
583
+ if format in _schema_converters:
584
+ return _schema_converters[format](desc) or {}
585
+ return {}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: singlestoredb
3
- Version: 1.1.0
3
+ Version: 1.3.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
@@ -1,8 +1,8 @@
1
- singlestoredb/__init__.py,sha256=NuWWRMAxfLsF4MfzHPtqOYXxfdrxVZ47nq6XI5ZvTa4,1634
1
+ singlestoredb/__init__.py,sha256=juu9u0zHHRDvLViF83NCU4pBRNBPEDElq5-VpoIoErg,1634
2
2
  singlestoredb/auth.py,sha256=u8D9tpKzrqa4ssaHjyZnGDX1q8XBpGtuoOkTkSv7B28,7599
3
- singlestoredb/config.py,sha256=NBbPhKuwdI57qxorzNV2CxSY7bNXGcukxG0w4fmoLV8,11625
4
- singlestoredb/connection.py,sha256=gDBIs3XgLOROVHtzMx9zmSYILc0aRVY7k8we3b4TxCw,44227
5
- singlestoredb/converters.py,sha256=aH_QhLr94i9_AjvcplTar0HfX2yi53KGxHHzJc7lSU0,12515
3
+ singlestoredb/config.py,sha256=H4pQxqBEGGCmVHg40VEnAdqGXHun8ougZzj-Ed6ZLH4,11822
4
+ singlestoredb/connection.py,sha256=aLc9_9q5pJ2DCHbmBkWP-4KlDPGoCyB92yaQfNtcnSA,44958
5
+ singlestoredb/converters.py,sha256=t1hRMZfccWJs_WyOw-W-Kh87fxsOkpOnKXAeh_Nr-zU,20681
6
6
  singlestoredb/exceptions.py,sha256=HuoA6sMRL5qiCiee-_5ddTGmFbYC9Euk8TYUsh5GvTw,3234
7
7
  singlestoredb/pytest.py,sha256=OyF3BO9mgxenifYhOihnzGk8WzCJ_zN5_mxe8XyFPOc,9074
8
8
  singlestoredb/types.py,sha256=FIqO1A7e0Gkk7ITmIysBy-P5S--ItbMSlYvblzqGS30,9969
@@ -13,47 +13,49 @@ singlestoredb/functions/dtypes.py,sha256=a2vevIug8NhiUCFiSOKwRPpdWU69Gn13ZoQ6Aov
13
13
  singlestoredb/functions/signature.py,sha256=fNnlTfc0R0sM9wm78UwG7Ok9eMJTtOfawrIpjts2wdY,18866
14
14
  singlestoredb/functions/ext/__init__.py,sha256=1oLL20yLB1GL9IbFiZD8OReDqiCpFr-yetIR6x1cNkI,23
15
15
  singlestoredb/functions/ext/arrow.py,sha256=WB7n1ACslyd8nlbFzUvlbxn1BVuEjA9-BGBEqCWlSOo,9061
16
- singlestoredb/functions/ext/asgi.py,sha256=2Dfx3A_IfE6yI3OMwU3TcsQOEoq-RENniT0xOgg56iI,39861
16
+ singlestoredb/functions/ext/asgi.py,sha256=orEm0MGziXRgCqV-TdT-A4lpy_zaKGtkg9sfHsbsfz0,40088
17
17
  singlestoredb/functions/ext/json.py,sha256=XkI8jirxi1T9F-M0p9NpLezph0MRAhYmDiPuU2Id0Uo,10404
18
18
  singlestoredb/functions/ext/mmap.py,sha256=OB6CIYoLe_AYuJM10lE0I6QhZJ5kMhLNbQo2Sp1wiZA,13711
19
19
  singlestoredb/functions/ext/rowdat_1.py,sha256=JgKRsVSQYczFD6cmo2xLilbNPYpyLL2tPOWO1Gh25ow,22306
20
20
  singlestoredb/functions/ext/utils.py,sha256=2-B8YU_Iekv8JcpI-ochs9TIeuyatLaLAH-AyYyUUIg,5311
21
21
  singlestoredb/fusion/__init__.py,sha256=Qo7SuqGw-l-vE8-EI2jhm6hXJkYfOLUKIws9c7LFNX0,356
22
22
  singlestoredb/fusion/graphql.py,sha256=ZA3HcDq5rER-dCEavwTqnF7KM0D2LCYIY7nLQk7lSso,5207
23
- singlestoredb/fusion/handler.py,sha256=E9WYaNOUvNFcywbrGsQ4E7EwgURJ_CxSWJJgwowQbBI,21337
24
- singlestoredb/fusion/registry.py,sha256=QAZOSMZcgauxwtyjnpiMf17jZ4u2vPb_vi7KwONNvyg,5718
23
+ singlestoredb/fusion/handler.py,sha256=hXvJoauKnixfU67IgobmuZF4WKchSzzhUwsPQf_FWT4,21581
24
+ singlestoredb/fusion/registry.py,sha256=jjdRTYZ3ylhy6gAoW5xBj0tkxGFBT-2yLQ0tztTgDIY,6112
25
25
  singlestoredb/fusion/result.py,sha256=Bd3KbRpqWqQcWp_Chd4bzBy8Kfc8nXLS_Pn_GGbPO6o,11772
26
26
  singlestoredb/fusion/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- singlestoredb/fusion/handlers/stage.py,sha256=B03Wtr3W0tn7jGxu3Je-z3krgc9NsW4sso38yUPgZcM,10865
27
+ singlestoredb/fusion/handlers/stage.py,sha256=4BSwqcmA4PI3oksTdYaTmQ6bY-AzmL0mZfGnP3U0ldM,13643
28
28
  singlestoredb/fusion/handlers/utils.py,sha256=oYbf13Y3orEkJfHMNnO7B_W1anEdK-0S9vVVkF2pPFk,5109
29
- singlestoredb/fusion/handlers/workspace.py,sha256=lY6j_wonX2cBIXmJWZKOjous44hhGfnT8vtmzQfImZg,19643
29
+ singlestoredb/fusion/handlers/workspace.py,sha256=EGxu-dAWNfHsknMNSk1n9cri_zhlMJap4ypywPFiMZQ,25000
30
30
  singlestoredb/http/__init__.py,sha256=A_2ZUCCpvRYIA6YDpPy57wL5R1eZ5SfP6I1To5nfJ2s,912
31
- singlestoredb/http/connection.py,sha256=RUPTgbnrvlp_fRCgoFl0og_-35TSVAAjkxUFctO8DWw,38818
32
- singlestoredb/management/__init__.py,sha256=jXtKvpvl5diiotXPiEi2EpJwhPLEMb4_MTpndjCz3Kg,202
31
+ singlestoredb/http/connection.py,sha256=HUYzgiGYRUblHhgDi-ghfXykGkdB9iQ3i_XVvhtqH88,39349
32
+ singlestoredb/management/__init__.py,sha256=puMnH8S3BWEgIlAmuLLh_ZqTN1jml7E8Mme30vkmPOQ,235
33
33
  singlestoredb/management/billing_usage.py,sha256=9ighjIpcopgIyJOktBYQ6pahBZmWGHOPyyCW4gu9FGs,3735
34
34
  singlestoredb/management/cluster.py,sha256=_TT4tV43VPDrtcdS_VN-TTYij7yFQzjAMeuYRF9zKj8,14362
35
35
  singlestoredb/management/manager.py,sha256=m8I5zTmEqjMCEE4fmmVdzza8TvofhnIHvO0np0WH-Y8,8810
36
- singlestoredb/management/organization.py,sha256=Oj4-VQoEc90hLQ9vxXu4fSrGWK_Qq5lftmkM1Q5l6lk,4916
36
+ singlestoredb/management/organization.py,sha256=OtAMTYkxgAYHh8QDUqez9Nq2X6AjP78izuQ5m19-qAE,4974
37
37
  singlestoredb/management/region.py,sha256=HnLcWUh7r_aLECliplCDHak4a_F3B7LOSXEYMW66qD0,1611
38
- singlestoredb/management/utils.py,sha256=sJlAmvHsqvgkFmpyXd4qIDoVi0Mxh9KGBGf_uF3cU4g,9197
39
- singlestoredb/management/workspace.py,sha256=gea-ehcd_HlmjqfiEeW7w9nMOG3aLsIW9xDPGjWELXs,59380
38
+ singlestoredb/management/utils.py,sha256=QKagKjAhezmBaGfNh81ncbA321mMV243cUY4CUMdcK8,9197
39
+ singlestoredb/management/workspace.py,sha256=jHNTZ_zqi80U20BS6ezJX5DLZxWX_68fV1GW870hh5s,61632
40
40
  singlestoredb/mysql/__init__.py,sha256=olUTAvkiERhDW41JXQMawkg-i0tvBEkoTkII1tt6lxU,4492
41
41
  singlestoredb/mysql/_auth.py,sha256=AugRitoUwgRIDFuJxuAH4MWIAmckY7Ji2pP6r_Ng9dY,8043
42
42
  singlestoredb/mysql/charset.py,sha256=-FlONDS_oAUF5B3mIgeHBPb_SCt4zHD33arUeBNctU0,10510
43
- singlestoredb/mysql/connection.py,sha256=YIOeh29j-dodDiz4BTboKp-0ep1MbLzQyKBcahkM2m4,67380
43
+ singlestoredb/mysql/connection.py,sha256=WZZl3cWLsyuKlQfB3CzXRmXnAXcTLDBUG8eAViYEwDw,70301
44
44
  singlestoredb/mysql/converters.py,sha256=CVe8SDmjbIAhy1xpQ2N5OKWw6t5eWpw-EU3QTlA0Hh0,7500
45
- singlestoredb/mysql/cursors.py,sha256=nmaODDK5rVxTF1yC6MAKTeYDCX3ByodK1JuDRJ7YBCM,26481
45
+ singlestoredb/mysql/cursors.py,sha256=Eqe7jITRvOo4P_TxIarTumg_2PG1DcCfZ4Uo9IFdDa8,26794
46
46
  singlestoredb/mysql/err.py,sha256=-m5rqXi8yhq6b8SCEJ2h0E5Rudh_15dlAU_WbJ1YrM8,2388
47
47
  singlestoredb/mysql/optionfile.py,sha256=DqL-rOQcqQncD5eVbPRkwZqo7Pj3Vh40VLx3E_e87TU,655
48
- singlestoredb/mysql/protocol.py,sha256=mPkF1xfSbqoW2dr8Tk4MpOKXRs_5Qj6xGFWSxo-AwhA,12180
48
+ singlestoredb/mysql/protocol.py,sha256=2GG8qTXy5npqo7z2D2K5T0S8PtoUOS-hFDEXy8VConw,14451
49
49
  singlestoredb/mysql/times.py,sha256=2j7purNVnJmjhOUgwUze-r3kNlCWqxjXj-jtqOzBfZI,463
50
50
  singlestoredb/mysql/constants/CLIENT.py,sha256=SSvMFPZCTVMU1UWa4zOrfhYMDdR2wG2mS0E5GzJhDsg,878
51
51
  singlestoredb/mysql/constants/COMMAND.py,sha256=TGITAUcNWlq2Gwg2wv5UK2ykdTd4LYTk_EcJJOCpGIc,679
52
52
  singlestoredb/mysql/constants/CR.py,sha256=z3Oa86nHVDgWcz_XYFOzkfvvfkZmEoNluzpbNOJxjKg,2305
53
53
  singlestoredb/mysql/constants/ER.py,sha256=cH5wgU-e70wd0uSygNR5IFCnnXcrR9WLwJPMH22bhUw,12296
54
- singlestoredb/mysql/constants/FIELD_TYPE.py,sha256=OU0MQ_NtfLEFG5Jy0Oay7rhhlkfGldyzxjf1rGaSN2M,382
54
+ singlestoredb/mysql/constants/EXTENDED_TYPE.py,sha256=HUWYXFsppd0jypu7BKjGqspEuaDwsxBkisoiwN-xEvA,29
55
+ singlestoredb/mysql/constants/FIELD_TYPE.py,sha256=OftDI47xn-sJmwHRuTjC9EFbLEEYDE_1BmD7_u334mg,765
55
56
  singlestoredb/mysql/constants/FLAG.py,sha256=Fy-PrCLnUI7fx_o5WypYnUAzWAM0E9d5yL8fFRVKffY,214
56
57
  singlestoredb/mysql/constants/SERVER_STATUS.py,sha256=m28Iq5JGCFCWLhafE73-iOvw_9gDGqnytW3NkHpbugA,333
58
+ singlestoredb/mysql/constants/VECTOR_TYPE.py,sha256=4aFqFB7gig4Qnh8G82FkE-rVeJCf-Z7jXaeEarxOqNw,63
57
59
  singlestoredb/mysql/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
60
  singlestoredb/mysql/tests/__init__.py,sha256=JFzNFYLRD6dxD9ZvGgGIZOWPMYKW8b4tywBsb_I51J4,997
59
61
  singlestoredb/mysql/tests/base.py,sha256=sv_VpPrJDvCt2QRlikG6_YWU3yJX3KEkdc96YRXGvEI,4025
@@ -76,14 +78,16 @@ singlestoredb/mysql/tests/thirdparty/test_MySQLdb/dbapi20.py,sha256=E5_jnyZEZ7_m
76
78
  singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py,sha256=szE4Zodgf7YwhkMBOrCvUwhTWppVtaodsqlV-vJ7fmY,3090
77
79
  singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_dbapi20.py,sha256=t_OzqsVnj_ReBbmY_wx51ZcWbLz9nASZ0hno-9YeiyQ,8022
78
80
  singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py,sha256=pl0bvuZo_nzAlYOINxRiR-Zi9khz0W2Pc7vP-K3sQYQ,2819
81
+ singlestoredb/notebook/__init__.py,sha256=5_Nfme_Tt6e22LoId6xpaiNcVYPR3pmHXDt7EoX9E6o,491
82
+ singlestoredb/notebook/_objects.py,sha256=YbJSp1meOP0Z4dyNmIQ6v823u5Yj0bKP7qRjiL2pN_k,7995
79
83
  singlestoredb/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
84
  singlestoredb/tests/empty.sql,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
85
  singlestoredb/tests/local_infile.csv,sha256=sBtqjvfkS9aoOVx8nMXYgYv4rDuT4OuYhqUhNRu0O68,42
82
- singlestoredb/tests/test.sql,sha256=rwH-Rai1aXZpc3NFYYu7gRmm0u6prP8epXF88jxUKTs,16196
86
+ singlestoredb/tests/test.sql,sha256=dfMehVCQ9wObSVTQKyQi-fRFDZeqRxV4Cj8doBCPEFM,17679
83
87
  singlestoredb/tests/test2.sql,sha256=D4U2GSlOVeo39U8-RMM4YziJzYFfi4Ztm2YXJVJVAS8,37
84
88
  singlestoredb/tests/test_basics.py,sha256=rUfUGZ54xybvgp11XYWdqnUYMKa6VckB3XkX9LFnxRw,44180
85
89
  singlestoredb/tests/test_config.py,sha256=63lyIQ2KrvGE6C9403B_4Mc90mX4tp42ys5Bih2sXrE,11184
86
- singlestoredb/tests/test_connection.py,sha256=v2Qg9vrJEgI16_75WZPMPjHrZd9ZzL6jEGoCeRD0DrQ,111071
90
+ singlestoredb/tests/test_connection.py,sha256=2NZSUwIRNyCw2A9WoIlisxbQc7PcA8xYoQEztTPTaHY,117405
87
91
  singlestoredb/tests/test_dbapi.py,sha256=IKq5Hcwx8WikASP8_AB5fo3TXv7ryWPCVGonoly00gI,652
88
92
  singlestoredb/tests/test_exceptions.py,sha256=tfr_8X2w1UmG4nkSBzWGB0C7ehrf1GAVgj6_ODaG-TM,1131
89
93
  singlestoredb/tests/test_ext_func.py,sha256=OWd-CJ1Owhx72nikSWWEF2EQFCJk7vEXZM2Oy9EbYQo,37357
@@ -104,11 +108,11 @@ singlestoredb/utils/convert_rows.py,sha256=A6up7a8Bq-eV2BXdGCotQviqp1Q7XdJ2MA933
104
108
  singlestoredb/utils/debug.py,sha256=0JiLA37u_9CKiDGiN9BK_PtFMUku3vIcNjERWaTNRSU,349
105
109
  singlestoredb/utils/dtypes.py,sha256=1qUiB4BJFJ7rOVh2mItQssYbJupV7uq1x8uwX-Eu2Ks,5898
106
110
  singlestoredb/utils/mogrify.py,sha256=-a56IF70U6CkfadeaZgfjRSVsAD3PuqRrzPpjZlgbwY,4050
107
- singlestoredb/utils/results.py,sha256=Hs34Q35UQzPQuTZ-mwidNJVU26WlQmSNqfpKwQ2XUfc,15153
111
+ singlestoredb/utils/results.py,sha256=bJtaUaDiFq26IsPAKZ2FHGB7csMn94EAxLKrP4HaEEA,15277
108
112
  singlestoredb/utils/xdict.py,sha256=S9HKgrPrnu_6b7iOwa2KrW8CmU1Uqx0BWdEyogFzWbE,12896
109
- singlestoredb-1.1.0.dist-info/LICENSE,sha256=Mlq78idURT-9G026aMYswwwnnrLcgzTLuXeAs5hjDLM,11341
110
- singlestoredb-1.1.0.dist-info/METADATA,sha256=ot7a3ospcq_NzVROohCEwXXv_sxcxvQXM-pn_pmlrhI,5570
111
- singlestoredb-1.1.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
112
- singlestoredb-1.1.0.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
113
- singlestoredb-1.1.0.dist-info/top_level.txt,sha256=eet8bVPNRqiGeY0PrO5ERH2UpamwlrKHEQCffz4dOh8,14
114
- singlestoredb-1.1.0.dist-info/RECORD,,
113
+ singlestoredb-1.3.0.dist-info/LICENSE,sha256=Mlq78idURT-9G026aMYswwwnnrLcgzTLuXeAs5hjDLM,11341
114
+ singlestoredb-1.3.0.dist-info/METADATA,sha256=PLBzts-ZoiYv7LrQvRGSKycJ9DJ7W2KsnLMDkFJ_1LA,5570
115
+ singlestoredb-1.3.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
116
+ singlestoredb-1.3.0.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
117
+ singlestoredb-1.3.0.dist-info/top_level.txt,sha256=eet8bVPNRqiGeY0PrO5ERH2UpamwlrKHEQCffz4dOh8,14
118
+ singlestoredb-1.3.0.dist-info/RECORD,,