singlestoredb 1.16.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.
Files changed (183) hide show
  1. singlestoredb/__init__.py +75 -0
  2. singlestoredb/ai/__init__.py +2 -0
  3. singlestoredb/ai/chat.py +139 -0
  4. singlestoredb/ai/embeddings.py +128 -0
  5. singlestoredb/alchemy/__init__.py +90 -0
  6. singlestoredb/apps/__init__.py +3 -0
  7. singlestoredb/apps/_cloud_functions.py +90 -0
  8. singlestoredb/apps/_config.py +72 -0
  9. singlestoredb/apps/_connection_info.py +18 -0
  10. singlestoredb/apps/_dashboards.py +47 -0
  11. singlestoredb/apps/_process.py +32 -0
  12. singlestoredb/apps/_python_udfs.py +100 -0
  13. singlestoredb/apps/_stdout_supress.py +30 -0
  14. singlestoredb/apps/_uvicorn_util.py +36 -0
  15. singlestoredb/auth.py +245 -0
  16. singlestoredb/config.py +484 -0
  17. singlestoredb/connection.py +1487 -0
  18. singlestoredb/converters.py +950 -0
  19. singlestoredb/docstring/__init__.py +33 -0
  20. singlestoredb/docstring/attrdoc.py +126 -0
  21. singlestoredb/docstring/common.py +230 -0
  22. singlestoredb/docstring/epydoc.py +267 -0
  23. singlestoredb/docstring/google.py +412 -0
  24. singlestoredb/docstring/numpydoc.py +562 -0
  25. singlestoredb/docstring/parser.py +100 -0
  26. singlestoredb/docstring/py.typed +1 -0
  27. singlestoredb/docstring/rest.py +256 -0
  28. singlestoredb/docstring/tests/__init__.py +1 -0
  29. singlestoredb/docstring/tests/_pydoctor.py +21 -0
  30. singlestoredb/docstring/tests/test_epydoc.py +729 -0
  31. singlestoredb/docstring/tests/test_google.py +1007 -0
  32. singlestoredb/docstring/tests/test_numpydoc.py +1100 -0
  33. singlestoredb/docstring/tests/test_parse_from_object.py +109 -0
  34. singlestoredb/docstring/tests/test_parser.py +248 -0
  35. singlestoredb/docstring/tests/test_rest.py +547 -0
  36. singlestoredb/docstring/tests/test_util.py +70 -0
  37. singlestoredb/docstring/util.py +141 -0
  38. singlestoredb/exceptions.py +120 -0
  39. singlestoredb/functions/__init__.py +16 -0
  40. singlestoredb/functions/decorator.py +201 -0
  41. singlestoredb/functions/dtypes.py +1793 -0
  42. singlestoredb/functions/ext/__init__.py +1 -0
  43. singlestoredb/functions/ext/arrow.py +375 -0
  44. singlestoredb/functions/ext/asgi.py +2133 -0
  45. singlestoredb/functions/ext/json.py +420 -0
  46. singlestoredb/functions/ext/mmap.py +413 -0
  47. singlestoredb/functions/ext/rowdat_1.py +724 -0
  48. singlestoredb/functions/ext/timer.py +89 -0
  49. singlestoredb/functions/ext/utils.py +218 -0
  50. singlestoredb/functions/signature.py +1578 -0
  51. singlestoredb/functions/typing/__init__.py +41 -0
  52. singlestoredb/functions/typing/numpy.py +20 -0
  53. singlestoredb/functions/typing/pandas.py +2 -0
  54. singlestoredb/functions/typing/polars.py +2 -0
  55. singlestoredb/functions/typing/pyarrow.py +2 -0
  56. singlestoredb/functions/utils.py +421 -0
  57. singlestoredb/fusion/__init__.py +11 -0
  58. singlestoredb/fusion/graphql.py +213 -0
  59. singlestoredb/fusion/handler.py +916 -0
  60. singlestoredb/fusion/handlers/__init__.py +0 -0
  61. singlestoredb/fusion/handlers/export.py +525 -0
  62. singlestoredb/fusion/handlers/files.py +690 -0
  63. singlestoredb/fusion/handlers/job.py +660 -0
  64. singlestoredb/fusion/handlers/models.py +250 -0
  65. singlestoredb/fusion/handlers/stage.py +502 -0
  66. singlestoredb/fusion/handlers/utils.py +324 -0
  67. singlestoredb/fusion/handlers/workspace.py +956 -0
  68. singlestoredb/fusion/registry.py +249 -0
  69. singlestoredb/fusion/result.py +399 -0
  70. singlestoredb/http/__init__.py +27 -0
  71. singlestoredb/http/connection.py +1267 -0
  72. singlestoredb/magics/__init__.py +34 -0
  73. singlestoredb/magics/run_personal.py +137 -0
  74. singlestoredb/magics/run_shared.py +134 -0
  75. singlestoredb/management/__init__.py +9 -0
  76. singlestoredb/management/billing_usage.py +148 -0
  77. singlestoredb/management/cluster.py +462 -0
  78. singlestoredb/management/export.py +295 -0
  79. singlestoredb/management/files.py +1102 -0
  80. singlestoredb/management/inference_api.py +105 -0
  81. singlestoredb/management/job.py +887 -0
  82. singlestoredb/management/manager.py +373 -0
  83. singlestoredb/management/organization.py +226 -0
  84. singlestoredb/management/region.py +169 -0
  85. singlestoredb/management/utils.py +423 -0
  86. singlestoredb/management/workspace.py +1927 -0
  87. singlestoredb/mysql/__init__.py +177 -0
  88. singlestoredb/mysql/_auth.py +298 -0
  89. singlestoredb/mysql/charset.py +214 -0
  90. singlestoredb/mysql/connection.py +2032 -0
  91. singlestoredb/mysql/constants/CLIENT.py +38 -0
  92. singlestoredb/mysql/constants/COMMAND.py +32 -0
  93. singlestoredb/mysql/constants/CR.py +78 -0
  94. singlestoredb/mysql/constants/ER.py +474 -0
  95. singlestoredb/mysql/constants/EXTENDED_TYPE.py +3 -0
  96. singlestoredb/mysql/constants/FIELD_TYPE.py +48 -0
  97. singlestoredb/mysql/constants/FLAG.py +15 -0
  98. singlestoredb/mysql/constants/SERVER_STATUS.py +10 -0
  99. singlestoredb/mysql/constants/VECTOR_TYPE.py +6 -0
  100. singlestoredb/mysql/constants/__init__.py +0 -0
  101. singlestoredb/mysql/converters.py +271 -0
  102. singlestoredb/mysql/cursors.py +896 -0
  103. singlestoredb/mysql/err.py +92 -0
  104. singlestoredb/mysql/optionfile.py +20 -0
  105. singlestoredb/mysql/protocol.py +450 -0
  106. singlestoredb/mysql/tests/__init__.py +19 -0
  107. singlestoredb/mysql/tests/base.py +126 -0
  108. singlestoredb/mysql/tests/conftest.py +37 -0
  109. singlestoredb/mysql/tests/test_DictCursor.py +132 -0
  110. singlestoredb/mysql/tests/test_SSCursor.py +141 -0
  111. singlestoredb/mysql/tests/test_basic.py +452 -0
  112. singlestoredb/mysql/tests/test_connection.py +851 -0
  113. singlestoredb/mysql/tests/test_converters.py +58 -0
  114. singlestoredb/mysql/tests/test_cursor.py +141 -0
  115. singlestoredb/mysql/tests/test_err.py +16 -0
  116. singlestoredb/mysql/tests/test_issues.py +514 -0
  117. singlestoredb/mysql/tests/test_load_local.py +75 -0
  118. singlestoredb/mysql/tests/test_nextset.py +88 -0
  119. singlestoredb/mysql/tests/test_optionfile.py +27 -0
  120. singlestoredb/mysql/tests/thirdparty/__init__.py +6 -0
  121. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/__init__.py +9 -0
  122. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/capabilities.py +323 -0
  123. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/dbapi20.py +865 -0
  124. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_capabilities.py +110 -0
  125. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_dbapi20.py +224 -0
  126. singlestoredb/mysql/tests/thirdparty/test_MySQLdb/test_MySQLdb_nonstandard.py +101 -0
  127. singlestoredb/mysql/times.py +23 -0
  128. singlestoredb/notebook/__init__.py +16 -0
  129. singlestoredb/notebook/_objects.py +213 -0
  130. singlestoredb/notebook/_portal.py +352 -0
  131. singlestoredb/py.typed +0 -0
  132. singlestoredb/pytest.py +352 -0
  133. singlestoredb/server/__init__.py +0 -0
  134. singlestoredb/server/docker.py +452 -0
  135. singlestoredb/server/free_tier.py +267 -0
  136. singlestoredb/tests/__init__.py +0 -0
  137. singlestoredb/tests/alltypes.sql +307 -0
  138. singlestoredb/tests/alltypes_no_nulls.sql +208 -0
  139. singlestoredb/tests/empty.sql +0 -0
  140. singlestoredb/tests/ext_funcs/__init__.py +702 -0
  141. singlestoredb/tests/local_infile.csv +3 -0
  142. singlestoredb/tests/test.ipynb +18 -0
  143. singlestoredb/tests/test.sql +680 -0
  144. singlestoredb/tests/test2.ipynb +18 -0
  145. singlestoredb/tests/test2.sql +1 -0
  146. singlestoredb/tests/test_basics.py +1332 -0
  147. singlestoredb/tests/test_config.py +318 -0
  148. singlestoredb/tests/test_connection.py +3103 -0
  149. singlestoredb/tests/test_dbapi.py +27 -0
  150. singlestoredb/tests/test_exceptions.py +45 -0
  151. singlestoredb/tests/test_ext_func.py +1472 -0
  152. singlestoredb/tests/test_ext_func_data.py +1101 -0
  153. singlestoredb/tests/test_fusion.py +1527 -0
  154. singlestoredb/tests/test_http.py +288 -0
  155. singlestoredb/tests/test_management.py +1599 -0
  156. singlestoredb/tests/test_plugin.py +33 -0
  157. singlestoredb/tests/test_results.py +171 -0
  158. singlestoredb/tests/test_types.py +132 -0
  159. singlestoredb/tests/test_udf.py +737 -0
  160. singlestoredb/tests/test_udf_returns.py +459 -0
  161. singlestoredb/tests/test_vectorstore.py +51 -0
  162. singlestoredb/tests/test_xdict.py +333 -0
  163. singlestoredb/tests/utils.py +141 -0
  164. singlestoredb/types.py +373 -0
  165. singlestoredb/utils/__init__.py +0 -0
  166. singlestoredb/utils/config.py +950 -0
  167. singlestoredb/utils/convert_rows.py +69 -0
  168. singlestoredb/utils/debug.py +13 -0
  169. singlestoredb/utils/dtypes.py +205 -0
  170. singlestoredb/utils/events.py +65 -0
  171. singlestoredb/utils/mogrify.py +151 -0
  172. singlestoredb/utils/results.py +585 -0
  173. singlestoredb/utils/xdict.py +425 -0
  174. singlestoredb/vectorstore.py +192 -0
  175. singlestoredb/warnings.py +5 -0
  176. singlestoredb-1.16.1.dist-info/METADATA +165 -0
  177. singlestoredb-1.16.1.dist-info/RECORD +183 -0
  178. singlestoredb-1.16.1.dist-info/WHEEL +5 -0
  179. singlestoredb-1.16.1.dist-info/entry_points.txt +2 -0
  180. singlestoredb-1.16.1.dist-info/licenses/LICENSE +201 -0
  181. singlestoredb-1.16.1.dist-info/top_level.txt +3 -0
  182. sqlx/__init__.py +4 -0
  183. sqlx/magic.py +113 -0
@@ -0,0 +1,271 @@
1
+ import datetime
2
+ import time
3
+ from decimal import Decimal
4
+ from typing import Any
5
+ from typing import Callable
6
+ from typing import Dict
7
+ from typing import Optional
8
+ from typing import Tuple
9
+ from typing import Union
10
+
11
+ from ..converters import converters as decoders
12
+ from .err import ProgrammingError
13
+
14
+ try:
15
+ import numpy as np
16
+ has_numpy = True
17
+ except ImportError:
18
+ has_numpy = False
19
+
20
+ try:
21
+ import shapely.geometry
22
+ import shapely.wkt
23
+ has_shapely = True
24
+ except ImportError:
25
+ has_shapely = False
26
+
27
+ try:
28
+ import pygeos
29
+ has_pygeos = True
30
+ except ImportError:
31
+ has_pygeos = False
32
+
33
+
34
+ Encoders = Dict[type, Callable[..., Union[str, Dict[str, str]]]]
35
+
36
+
37
+ def escape_item(val: Any, charset: str, mapping: Optional[Encoders] = None) -> str:
38
+ if mapping is None:
39
+ mapping = encoders
40
+ encoder = mapping.get(type(val), None)
41
+
42
+ # Fallback to default when no encoder found
43
+ if encoder is None:
44
+ try:
45
+ encoder = mapping[str]
46
+ except KeyError:
47
+ raise TypeError('no default type converter defined')
48
+
49
+ if encoder in (escape_dict, escape_sequence):
50
+ val = encoder(val, charset, mapping)
51
+ else:
52
+ val = encoder(val, mapping)
53
+ return val
54
+
55
+
56
+ def escape_dict(
57
+ val: Dict[str, Any],
58
+ charset: str,
59
+ mapping: Optional[Encoders] = None,
60
+ ) -> Dict[str, str]:
61
+ n = {}
62
+ for k, v in val.items():
63
+ quoted = escape_item(v, charset, mapping)
64
+ n[k] = quoted
65
+ return n
66
+
67
+
68
+ def escape_sequence(
69
+ val: Any,
70
+ charset: str,
71
+ mapping: Optional[Encoders] = None,
72
+ ) -> str:
73
+ n = []
74
+ for item in val:
75
+ quoted = escape_item(item, charset, mapping)
76
+ n.append(quoted)
77
+ return '(' + ','.join(n) + ')'
78
+
79
+
80
+ def escape_set(val: Any, charset: str, mapping: Optional[Encoders] = None) -> str:
81
+ return ','.join([escape_item(x, charset, mapping) for x in val])
82
+
83
+
84
+ def escape_bool(value: Any, mapping: Optional[Encoders] = None) -> str:
85
+ return str(int(value))
86
+
87
+
88
+ def escape_int(value: Any, mapping: Optional[Encoders] = None) -> str:
89
+ return str(value)
90
+
91
+
92
+ def escape_float(
93
+ value: Any,
94
+ mapping: Optional[Encoders] = None,
95
+ nan_as_null: bool = False,
96
+ inf_as_null: bool = False,
97
+ ) -> str:
98
+ s = repr(value)
99
+ if s == 'nan':
100
+ if nan_as_null:
101
+ return 'NULL'
102
+ raise ProgrammingError(0, '%s can not be used with SingleStoreDB' % s)
103
+ if s == 'inf':
104
+ if inf_as_null:
105
+ return 'NULL'
106
+ raise ProgrammingError(0, '%s can not be used with SingleStoreDB' % s)
107
+ if 'e' not in s:
108
+ s += 'e0'
109
+ return s
110
+
111
+
112
+ _escape_table = [chr(x) for x in range(128)]
113
+ _escape_table[0] = '\\0'
114
+ _escape_table[ord('\\')] = '\\\\'
115
+ _escape_table[ord('\n')] = '\\n'
116
+ _escape_table[ord('\r')] = '\\r'
117
+ _escape_table[ord('\032')] = '\\Z'
118
+ _escape_table[ord('"')] = '\\"'
119
+ _escape_table[ord("'")] = "\\'"
120
+
121
+
122
+ def escape_string(value: str, mapping: Optional[Encoders] = None) -> str:
123
+ """
124
+ Escapes *value* without adding quote.
125
+
126
+ Value should be unicode
127
+
128
+ """
129
+ return value.translate(_escape_table)
130
+
131
+
132
+ def escape_bytes_prefixed(value: bytes, mapping: Optional[Encoders] = None) -> str:
133
+ return "_binary X'{}'".format(value.hex())
134
+
135
+
136
+ def escape_bytes(value: bytes, mapping: Optional[Encoders] = None) -> str:
137
+ return "X'{}'".format(value.hex())
138
+
139
+
140
+ def escape_str(value: str, mapping: Optional[Encoders] = None) -> str:
141
+ return "'{}'".format(escape_string(str(value), mapping))
142
+
143
+
144
+ def escape_None(value: str, mapping: Optional[Encoders] = None) -> str:
145
+ return 'NULL'
146
+
147
+
148
+ def escape_timedelta(obj: datetime.timedelta, mapping: Optional[Encoders] = None) -> str:
149
+ seconds = int(obj.seconds) % 60
150
+ minutes = int(obj.seconds // 60) % 60
151
+ hours = int(obj.seconds // 3600) % 24 + int(obj.days) * 24
152
+ if obj.microseconds:
153
+ fmt = "'{0:02d}:{1:02d}:{2:02d}.{3:06d}'"
154
+ else:
155
+ fmt = "'{0:02d}:{1:02d}:{2:02d}'"
156
+ return fmt.format(hours, minutes, seconds, obj.microseconds)
157
+
158
+
159
+ def escape_time(obj: datetime.time, mapping: Optional[Encoders] = None) -> str:
160
+ if obj.microsecond:
161
+ fmt = "'{0.hour:02}:{0.minute:02}:{0.second:02}.{0.microsecond:06}'"
162
+ else:
163
+ fmt = "'{0.hour:02}:{0.minute:02}:{0.second:02}'"
164
+ return fmt.format(obj)
165
+
166
+
167
+ def escape_datetime(obj: datetime.datetime, mapping: Optional[Encoders] = None) -> str:
168
+ if obj.microsecond:
169
+ fmt = "'{0.year:04}-{0.month:02}-{0.day:02} " \
170
+ "{0.hour:02}:{0.minute:02}:{0.second:02}.{0.microsecond:06}'"
171
+ else:
172
+ fmt = "'{0.year:04}-{0.month:02}-{0.day:02} " \
173
+ "{0.hour:02}:{0.minute:02}:{0.second:02}'"
174
+ return fmt.format(obj)
175
+
176
+
177
+ def escape_date(obj: datetime.date, mapping: Optional[Encoders] = None) -> str:
178
+ fmt = "'{0.year:04}-{0.month:02}-{0.day:02}'"
179
+ return fmt.format(obj)
180
+
181
+
182
+ def escape_struct_time(obj: Tuple[Any, ...], mapping: Optional[Encoders] = None) -> str:
183
+ return escape_datetime(datetime.datetime(*obj[:6]))
184
+
185
+
186
+ def Decimal2Literal(o: Any, d: Any) -> str:
187
+ return format(o, 'f')
188
+
189
+
190
+ def through(x: Any) -> Any:
191
+ return x
192
+
193
+
194
+ # def convert_bit(b):
195
+ # b = "\x00" * (8 - len(b)) + b # pad w/ zeroes
196
+ # return struct.unpack(">Q", b)[0]
197
+ #
198
+ # the snippet above is right, but MySQLdb doesn't process bits,
199
+ # so we shouldn't either
200
+ convert_bit = through
201
+
202
+
203
+ encoders: Encoders = {
204
+ bool: escape_bool,
205
+ int: escape_int,
206
+ float: escape_float,
207
+ str: escape_str,
208
+ bytes: escape_bytes,
209
+ tuple: escape_sequence,
210
+ list: escape_sequence,
211
+ set: escape_sequence,
212
+ frozenset: escape_sequence,
213
+ dict: escape_dict,
214
+ type(None): escape_None,
215
+ datetime.date: escape_date,
216
+ datetime.datetime: escape_datetime,
217
+ datetime.timedelta: escape_timedelta,
218
+ datetime.time: escape_time,
219
+ time.struct_time: escape_struct_time,
220
+ Decimal: Decimal2Literal,
221
+ }
222
+
223
+ if has_numpy:
224
+
225
+ def escape_numpy(value: Any, mapping: Optional[Encoders] = None) -> str:
226
+ """Convert numpy arrays to vectors of bytes."""
227
+ return escape_bytes(value.tobytes(), mapping=mapping)
228
+
229
+ encoders[np.ndarray] = escape_numpy
230
+ encoders[np.float16] = escape_float
231
+ encoders[np.float32] = escape_float
232
+ encoders[np.float64] = escape_float
233
+ if hasattr(np, 'float128'):
234
+ encoders[np.float128] = escape_float
235
+ encoders[np.uint] = escape_int
236
+ encoders[np.uint8] = escape_int
237
+ encoders[np.uint16] = escape_int
238
+ encoders[np.uint32] = escape_int
239
+ encoders[np.uint64] = escape_int
240
+ encoders[np.integer] = escape_int
241
+ encoders[np.int_] = escape_int
242
+ encoders[np.int8] = escape_int
243
+ encoders[np.int16] = escape_int
244
+ encoders[np.int32] = escape_int
245
+ encoders[np.int64] = escape_int
246
+
247
+ if has_shapely:
248
+
249
+ def escape_shapely(value: Any, mapping: Optional[Encoders] = None) -> str:
250
+ """Convert shapely geo objects."""
251
+ return escape_str(shapely.wkt.dumps(value), mapping=mapping)
252
+
253
+ encoders[shapely.geometry.Polygon] = escape_shapely
254
+ encoders[shapely.geometry.Point] = escape_shapely
255
+ encoders[shapely.geometry.LineString] = escape_shapely
256
+
257
+ if has_pygeos:
258
+
259
+ def escape_pygeos(value: Any, mapping: Optional[Encoders] = None) -> str:
260
+ """Convert pygeos objects."""
261
+ return escape_str(pygeos.io.to_wkt(value), mapping=mapping)
262
+
263
+ encoders[pygeos.Geometry] = escape_pygeos
264
+
265
+
266
+ # for MySQLdb compatibility
267
+ conversions = encoders.copy() # type: ignore
268
+ conversions.update(decoders) # type: ignore
269
+ Thing2Literal = escape_str
270
+
271
+ # Run doctests with `pytest --doctest-modules pymysql/converters.py`