singlestoredb 0.7.1__cp36-abi3-macosx_10_9_universal2.whl → 0.7.3__cp36-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.

Binary file
singlestoredb/__init__.py CHANGED
@@ -13,7 +13,7 @@ Examples
13
13
 
14
14
  """
15
15
 
16
- __version__ = '0.7.1'
16
+ __version__ = '0.7.3'
17
17
 
18
18
  from .config import options, get_option, set_option, describe_option
19
19
  from .connection import connect, apilevel, threadsafety, paramstyle
singlestoredb/config.py CHANGED
@@ -230,3 +230,10 @@ register_option(
230
230
  'Print queries and parameters to stderr.',
231
231
  environ='SINGLESTOREDB_DEBUG_QUERIES',
232
232
  )
233
+
234
+
235
+ register_option(
236
+ 'debug.connection', 'bool', check_bool, False,
237
+ 'Print connection tracing information.',
238
+ environ='SINGLESTOREDB_DEBUG_CONNECTION',
239
+ )
@@ -16,8 +16,10 @@ except ImportError:
16
16
  from functools import partial
17
17
  import hashlib
18
18
 
19
+ from ..config import get_option
19
20
 
20
- DEBUG = False
21
+
22
+ DEBUG = get_option('debug.connection')
21
23
  SCRAMBLE_LENGTH = 20
22
24
  sha1_new = partial(hashlib.new, 'sha1')
23
25
 
@@ -46,6 +46,7 @@ from .protocol import (
46
46
  LoadLocalPacketWrapper,
47
47
  )
48
48
  from . import err
49
+ from ..config import get_option
49
50
  from ..connection import Connection as BaseConnection
50
51
 
51
52
  try:
@@ -65,7 +66,7 @@ except (ImportError, KeyError):
65
66
  # KeyError occurs when there's no entry in OS database for a current user.
66
67
  DEFAULT_USER = None
67
68
 
68
- DEBUG = False
69
+ DEBUG = get_option('debug.connection')
69
70
 
70
71
  TEXT_TYPES = {
71
72
  FIELD_TYPE.BIT,
@@ -5,13 +5,14 @@ import struct
5
5
  import sys
6
6
 
7
7
  from . import err
8
+ from ..config import get_option
8
9
  from ..utils.results import Description
9
10
  from .charset import MBLENGTH
10
11
  from .constants import FIELD_TYPE
11
12
  from .constants import SERVER_STATUS
12
13
 
13
14
 
14
- DEBUG = False
15
+ DEBUG = get_option('debug.connection')
15
16
 
16
17
  NULL_COLUMN = 251
17
18
  UNSIGNED_CHAR_COLUMN = 251
@@ -0,0 +1,283 @@
1
+ #!/usr/bin/env python
2
+ """Pytest plugin"""
3
+ import logging
4
+ import os
5
+ import subprocess
6
+ import time
7
+ from enum import Enum
8
+ from typing import Iterator
9
+ from typing import Optional
10
+
11
+ import pytest
12
+
13
+ from . import connect
14
+ from .connection import Connection
15
+ from .connection import Cursor
16
+
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ # How many times to attempt to connect to the container
22
+ STARTUP_CONNECT_ATTEMPTS = 10
23
+ # How long to wait between connection attempts
24
+ STARTUP_CONNECT_TIMEOUT_SECONDS = 2
25
+ # How many times to check if all connections are closed
26
+ TEARDOWN_WAIT_ATTEMPTS = 20
27
+ # How long to wait between checking connections
28
+ TEARDOWN_WAIT_SECONDS = 2
29
+
30
+
31
+ class ExecutionMode(Enum):
32
+ SEQUENTIAL = 1
33
+ LEADER = 2
34
+ FOLLOWER = 3
35
+
36
+
37
+ @pytest.fixture(scope='session')
38
+ def execution_mode() -> ExecutionMode:
39
+ """Determine the pytest mode for this process"""
40
+
41
+ worker = os.environ.get('PYTEST_XDIST_WORKER')
42
+ worker_count = os.environ.get('PYTEST_XDIST_WORKER_COUNT')
43
+
44
+ # If we're not in pytest-xdist, the mode is Sequential
45
+ if worker is None or worker_count is None:
46
+ logger.debug('XDIST environment vars not found')
47
+ return ExecutionMode.SEQUENTIAL
48
+
49
+ logger.debug(f'PYTEST_XDIST_WORKER == {worker}')
50
+ logger.debug(f'PYTEST_XDIST_WORKER_COUNT == {worker_count}')
51
+
52
+ # If we're the only worker, than the mode is Sequential
53
+ if worker_count == '1':
54
+ return ExecutionMode.SEQUENTIAL
55
+ else:
56
+ # The first worker (named "gw0") is the leader
57
+ # if there are multiple workers
58
+ if worker == 'gw0':
59
+ return ExecutionMode.LEADER
60
+ else:
61
+ return ExecutionMode.FOLLOWER
62
+
63
+
64
+ @pytest.fixture(scope='session')
65
+ def node_name() -> Iterator[str]:
66
+ """Determine the name of this worker node"""
67
+
68
+ worker = os.environ.get('PYTEST_XDIST_WORKER')
69
+
70
+ if worker is None:
71
+ logger.debug('XDIST environment vars not found')
72
+ yield 'master'
73
+ else:
74
+ logger.debug(f'PYTEST_XDIST_WORKER == {worker}')
75
+ yield worker
76
+
77
+
78
+ class _TestContainerManager():
79
+ """Manages the setup and teardown of a SingleStoreDB Dev Container"""
80
+
81
+ def __init__(self) -> None:
82
+ self.container_name = 'singlestoredb-test-container'
83
+ self.dev_image_name = 'ghcr.io/singlestore-labs/singlestoredb-dev'
84
+
85
+ assert 'SINGLESTORE_LICENSE' in os.environ, 'SINGLESTORE_LICENSE not set'
86
+
87
+ self.root_password = 'Q8r4D7yXR8oqn'
88
+ self.environment_vars = {
89
+ 'SINGLESTORE_LICENSE': None,
90
+ 'ROOT_PASSWORD': f"\"{self.root_password}\"",
91
+ 'SINGLESTORE_SET_GLOBAL_DEFAULT_PARTITIONS_PER_LEAF': '1',
92
+ }
93
+
94
+ self.ports = ['3306', '8080', '9000']
95
+
96
+ self.url = f'root:{self.root_password}@127.0.0.1:3306'
97
+
98
+ def start(self) -> None:
99
+ command = ' '.join(self._start_command())
100
+
101
+ logger.info(f'Starting container {self.container_name}')
102
+ try:
103
+ license = os.environ['SINGLESTORE_LICENSE']
104
+ env = {
105
+ 'SINGLESTORE_LICENSE': license,
106
+ }
107
+ subprocess.check_call(command, shell=True, env=env)
108
+ except Exception as e:
109
+ logger.exception(e)
110
+ raise RuntimeError(
111
+ 'Failed to start container. '
112
+ 'Is one already running?',
113
+ ) from e
114
+ logger.debug('Container started')
115
+
116
+ def _start_command(self) -> Iterator[str]:
117
+ yield 'docker run -d --name'
118
+ yield self.container_name
119
+ for key, value in self.environment_vars.items():
120
+ yield '-e'
121
+ if value is None:
122
+ yield key
123
+ else:
124
+ yield f'{key}={value}'
125
+
126
+ for port in self.ports:
127
+ yield '-p'
128
+ yield f'{port}:{port}'
129
+
130
+ yield self.dev_image_name
131
+
132
+ def print_logs(self) -> None:
133
+ logs_command = ['docker', 'logs', self.container_name]
134
+ logger.info('Getting logs')
135
+ logger.info(subprocess.check_output(logs_command))
136
+
137
+ def connect(self) -> Connection:
138
+ # Run all but one attempts trying again if they fail
139
+ for i in range(STARTUP_CONNECT_ATTEMPTS - 1):
140
+ try:
141
+ return connect(self.url)
142
+ except Exception:
143
+ logger.debug(f'Database not available yet (attempt #{i}).')
144
+ time.sleep(STARTUP_CONNECT_TIMEOUT_SECONDS)
145
+ else:
146
+ # Try one last time and report error if it fails
147
+ try:
148
+ return connect(self.url)
149
+ except Exception as e:
150
+ logger.error('Timed out while waiting to connect to database.')
151
+ logger.exception(e)
152
+ self.print_logs()
153
+ raise RuntimeError('Failed to connect to database') from e
154
+
155
+ def wait_till_connections_closed(self) -> None:
156
+ heart_beat = connect(self.url)
157
+ for i in range(TEARDOWN_WAIT_ATTEMPTS):
158
+ connections = self.get_open_connections(heart_beat)
159
+ if connections is None:
160
+ raise RuntimeError('Could not determine the number of open connections.')
161
+ logger.debug(
162
+ f'Waiting for other connections (n={connections-1}) '
163
+ f'to close (attempt #{i})',
164
+ )
165
+ time.sleep(TEARDOWN_WAIT_SECONDS)
166
+ else:
167
+ logger.warning('Timed out while waiting for other connections to close')
168
+ self.print_logs()
169
+
170
+ def get_open_connections(self, conn: Connection) -> Optional[int]:
171
+ for row in conn.show.status(extended=True):
172
+ name = row['Name']
173
+ value = row['Value']
174
+ logger.info(f'{name} = {value}')
175
+ if name == 'Threads_connected':
176
+ return int(value)
177
+
178
+ return None
179
+
180
+ def stop(self) -> None:
181
+ logger.info('Cleaning up SingleStore DB dev container')
182
+ logger.debug('Stopping container')
183
+ try:
184
+ subprocess.check_call(f'docker stop {self.container_name}', shell=True)
185
+ except Exception as e:
186
+ logger.exception(e)
187
+ raise RuntimeError('Failed to stop container.') from e
188
+
189
+ logger.debug('Removing container')
190
+ try:
191
+ subprocess.check_call(f'docker rm {self.container_name}', shell=True)
192
+ except Exception as e:
193
+ logger.exception(e)
194
+ raise RuntimeError('Failed to stop container.') from e
195
+
196
+
197
+ @pytest.fixture(scope='session')
198
+ def singlestoredb_test_container(
199
+ execution_mode: ExecutionMode,
200
+ ) -> Iterator[_TestContainerManager]:
201
+ """Sets up and tears down the test container"""
202
+
203
+ if not isinstance(execution_mode, ExecutionMode):
204
+ raise TypeError(f"Invalid execution mode '{execution_mode}'")
205
+
206
+ container_manager = _TestContainerManager()
207
+
208
+ # In sequential operation do all the steps
209
+ if execution_mode == ExecutionMode.SEQUENTIAL:
210
+ logger.debug('Not distributed')
211
+ container_manager.start()
212
+ yield container_manager
213
+ container_manager.stop()
214
+
215
+ # In distributed execution as leader,
216
+ # do the steps but wait for other workers before stopping
217
+ elif execution_mode == ExecutionMode.LEADER:
218
+ logger.debug('Distributed leader')
219
+ container_manager.start()
220
+ yield container_manager
221
+ container_manager.wait_till_connections_closed()
222
+ container_manager.stop()
223
+
224
+ # In distributed exeuction as a non-leader,
225
+ # don't worry about the container lifecycle
226
+ elif execution_mode == ExecutionMode.FOLLOWER:
227
+ logger.debug('Distributed follower')
228
+ yield container_manager
229
+
230
+
231
+ @pytest.fixture(scope='session')
232
+ def singlestoredb_connection(
233
+ singlestoredb_test_container: _TestContainerManager,
234
+ ) -> Iterator[Connection]:
235
+ """Creates and closes the connection"""
236
+
237
+ connection = singlestoredb_test_container.connect()
238
+ logger.debug('Connected to database.')
239
+
240
+ yield connection
241
+
242
+ logger.debug('Closing connection')
243
+ connection.close()
244
+
245
+
246
+ class _NameAllocator():
247
+ """Generates unique names for each database"""
248
+
249
+ def __init__(self, id: str) -> None:
250
+ self.id = id
251
+ self.names = 0
252
+
253
+ def get_name(self) -> str:
254
+ name = f'x_db_{self.id}_{self.names}'
255
+ self.names += 1
256
+ return name
257
+
258
+
259
+ @pytest.fixture(scope='session')
260
+ def name_allocator(node_name: str) -> Iterator[_NameAllocator]:
261
+ """Makes a worker-local name allocator using the node name"""
262
+
263
+ yield _NameAllocator(node_name)
264
+
265
+
266
+ @pytest.fixture
267
+ def singlestoredb_tempdb(
268
+ singlestoredb_connection: Connection, name_allocator: _NameAllocator,
269
+ ) -> Iterator[Cursor]:
270
+ """Provides a connection to a unique temporary test database"""
271
+
272
+ assert singlestoredb_connection.is_connected(), 'Database is no longer connected'
273
+ db = name_allocator.get_name()
274
+
275
+ with singlestoredb_connection.cursor() as cursor:
276
+ logger.debug(f"Creating temporary DB \"{db}\"")
277
+ cursor.execute(f'CREATE DATABASE {db}')
278
+ cursor.execute(f'USE {db}')
279
+
280
+ yield cursor
281
+
282
+ logger.debug(f"Dropping temporary DB \"{db}\"")
283
+ cursor.execute(f'DROP DATABASE {db}')
@@ -4,6 +4,7 @@
4
4
  import datetime
5
5
  import decimal
6
6
  import os
7
+ import string
7
8
  import unittest
8
9
 
9
10
  try:
@@ -1105,6 +1106,59 @@ class TestBasics(unittest.TestCase):
1105
1106
  self.cur.execute(f"SELECT 1999 :> YEAR, '{string}'")
1106
1107
  self.assertEqual((1999, string), self.cur.fetchone())
1107
1108
 
1109
+ def test_character_lengths(self):
1110
+ if self.conn.driver in ['http', 'https']:
1111
+ self.skipTest('Response size too big for http')
1112
+
1113
+ test_id = id(self)
1114
+ self.cur.execute(rf'''
1115
+ CREATE TABLE `test_character_lengths_{test_id}` (
1116
+ `id` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
1117
+ `char_col` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
1118
+ `int_col` INT,
1119
+ PRIMARY KEY (`id`),
1120
+ SORT KEY `id` (`id`)
1121
+ ) AUTOSTATS_CARDINALITY_MODE=INCREMENTAL
1122
+ AUTOSTATS_HISTOGRAM_MODE=CREATE
1123
+ AUTOSTATS_SAMPLING=ON
1124
+ SQL_MODE='STRICT_ALL_TABLES'
1125
+ ''')
1126
+ CHAR_STR = string.ascii_letters * 1
1127
+ SHORT_STR = string.ascii_letters * 10
1128
+ INT24_STR = string.ascii_letters * 1500
1129
+ INT64_STR = string.ascii_letters * 1500000
1130
+ data = [
1131
+ ['CHAR', CHAR_STR, 123456],
1132
+ ['SHORT', SHORT_STR, 123456],
1133
+ ['INT24', INT24_STR, 123456],
1134
+ ['INT64', INT64_STR, 123456],
1135
+ ]
1136
+ self.cur.executemany(
1137
+ f'INSERT INTO test_character_lengths_{test_id}(id, char_col, int_col) '
1138
+ 'VALUES (%s, %s, %s)', data,
1139
+ )
1140
+ self.cur.execute(
1141
+ f'SELECT id, char_col, int_col FROM test_character_lengths_{test_id} '
1142
+ 'WHERE id = "CHAR"',
1143
+ )
1144
+ assert data[0] == list(list(self.cur)[0])
1145
+ self.cur.execute(
1146
+ f'SELECT id, char_col, int_col FROM test_character_lengths_{test_id} '
1147
+ 'WHERE id = "SHORT"',
1148
+ )
1149
+ assert data[1] == list(list(self.cur)[0])
1150
+ self.cur.execute(
1151
+ f'SELECT id, char_col, int_col FROM test_character_lengths_{test_id} '
1152
+ 'WHERE id = "INT24"',
1153
+ )
1154
+ assert data[2] == list(list(self.cur)[0])
1155
+ self.cur.execute(
1156
+ f'SELECT id, char_col, int_col FROM test_character_lengths_{test_id} '
1157
+ 'WHERE id = "INT64"',
1158
+ )
1159
+ assert data[3] == list(list(self.cur)[0])
1160
+ self.cur.execute(rf'DROP TABLE `test_character_lengths_{test_id}`')
1161
+
1108
1162
 
1109
1163
  if __name__ == '__main__':
1110
1164
  import nose2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: singlestoredb
3
- Version: 0.7.1
3
+ Version: 0.7.3
4
4
  Summary: Interface to the SingleStore database and cluster management APIs
5
5
  Home-page: https://github.com/singlestore-labs/singlestoredb-python
6
6
  Author: SingleStore
@@ -29,7 +29,7 @@ Requires-Dist: ibis-singlestoredb ; extra == 'dataframe'
29
29
  Provides-Extra: dbt
30
30
  Requires-Dist: dbt-singlestore ; extra == 'dbt'
31
31
  Provides-Extra: ed22519
32
- Requires-Dist: PyNaCl (>=1.4.0) ; extra == 'ed22519'
32
+ Requires-Dist: PyNaCl >=1.4.0 ; extra == 'ed22519'
33
33
  Provides-Extra: gssapi
34
34
  Requires-Dist: gssapi ; extra == 'gssapi'
35
35
  Provides-Extra: ibis
@@ -1,20 +1,21 @@
1
- _singlestoredb_accel.abi3.so,sha256=V7IrUkYd0LtNn-xDW3Kb56LOoi28_5Sf4R0eVc2XTnE,154845
2
- singlestoredb-0.7.1.dist-info/RECORD,,
3
- singlestoredb-0.7.1.dist-info/LICENSE,sha256=Mlq78idURT-9G026aMYswwwnnrLcgzTLuXeAs5hjDLM,11341
4
- singlestoredb-0.7.1.dist-info/WHEEL,sha256=L_8uSJgNH7VmiqwHcew_IFGyTcruK-C2YxnyqVh4uE0,113
5
- singlestoredb-0.7.1.dist-info/top_level.txt,sha256=SDtemIXf-Kp-_F2f_S6x0db33cHGOILdAEsIQZe2LZc,35
6
- singlestoredb-0.7.1.dist-info/METADATA,sha256=ZJZSjXFxykKHkdb2cFmLGUh9Fir_HeaJxtEf-_utWdU,7857
1
+ _singlestoredb_accel.abi3.so,sha256=CITR7xiU8llX-0oeejt3Bb21dcOcTIzi2MNRxTe2rMI,154873
2
+ singlestoredb-0.7.3.dist-info/RECORD,,
3
+ singlestoredb-0.7.3.dist-info/LICENSE,sha256=Mlq78idURT-9G026aMYswwwnnrLcgzTLuXeAs5hjDLM,11341
4
+ singlestoredb-0.7.3.dist-info/WHEEL,sha256=VAdTNBN2V38nmUxcCdubY6bt9wfLIj6Xfitk92_u7J4,113
5
+ singlestoredb-0.7.3.dist-info/top_level.txt,sha256=SDtemIXf-Kp-_F2f_S6x0db33cHGOILdAEsIQZe2LZc,35
6
+ singlestoredb-0.7.3.dist-info/METADATA,sha256=R8gcwGj8LM0EAxwOyA-Q42OFBtGciwQ91yK2P_GrIYU,7855
7
7
  singlestoredb/auth.py,sha256=u8D9tpKzrqa4ssaHjyZnGDX1q8XBpGtuoOkTkSv7B28,7599
8
- singlestoredb/config.py,sha256=lqSQ8cGbH3UwZ9urkxdktYS4VVl7RAe_MB8DS2MqowQ,6314
9
- singlestoredb/__init__.py,sha256=BrFhWBxfE2KA-h0jRXZ5w4_gVH1juS9qpjnF65qY_-k,842
8
+ singlestoredb/config.py,sha256=c8UG3qL2atjECS-9FOgUpixqQmiAc26GYh9W-9N6Wgk,6477
9
+ singlestoredb/__init__.py,sha256=4vHLXqAI-ijhpK5HRZJb439GiNeP8cbCk1IgIb3R4L4,842
10
10
  singlestoredb/types.py,sha256=FIqO1A7e0Gkk7ITmIysBy-P5S--ItbMSlYvblzqGS30,9969
11
11
  singlestoredb/connection.py,sha256=8vdmPj6CsJpHe6bJfKT_b8AinXCD3XHSOT8_ljMJ2ZI,43470
12
+ singlestoredb/pytest.py,sha256=OyF3BO9mgxenifYhOihnzGk8WzCJ_zN5_mxe8XyFPOc,9074
12
13
  singlestoredb/exceptions.py,sha256=HiHRMO36MT06RM-LfURlA6AadCiQtnOodxJtZorKJzU,2459
13
14
  singlestoredb/converters.py,sha256=aH_QhLr94i9_AjvcplTar0HfX2yi53KGxHHzJc7lSU0,12515
14
15
  singlestoredb/tests/test.sql,sha256=9fIAnyjLYNJd6NrSP2k109EYULno9_DDiMG5OE6JARY,8968
15
16
  singlestoredb/tests/test_xdict.py,sha256=fqHspoi39nbX3fIDVkkRXcd5H50xdOsSvK0bxAMQnaE,10408
16
17
  singlestoredb/tests/test_results.py,sha256=5S4M6gK69HZnYV7O9I2Onx9gfZpUi52RD4Jm7ETahxo,6582
17
- singlestoredb/tests/test_basics.py,sha256=31puc1yB9lq17t7UsTS0NHi6AirOBNfbKdQZrdiYD4c,40220
18
+ singlestoredb/tests/test_basics.py,sha256=-ejNGyv1XB52oqz65Ls6ABPknQc1pM_xsYJV46XtC5I,42401
18
19
  singlestoredb/tests/test_connection.py,sha256=Qay7_oNl0EQahipZZZCAiLOcsQwL4OEtGmc_rnQ-eLM,50732
19
20
  singlestoredb/tests/test_exceptions.py,sha256=tfr_8X2w1UmG4nkSBzWGB0C7ehrf1GAVgj6_ODaG-TM,1131
20
21
  singlestoredb/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -40,16 +41,16 @@ singlestoredb/utils/xdict.py,sha256=S9HKgrPrnu_6b7iOwa2KrW8CmU1Uqx0BWdEyogFzWbE,
40
41
  singlestoredb/utils/debug.py,sha256=0JiLA37u_9CKiDGiN9BK_PtFMUku3vIcNjERWaTNRSU,349
41
42
  singlestoredb/http/__init__.py,sha256=A_2ZUCCpvRYIA6YDpPy57wL5R1eZ5SfP6I1To5nfJ2s,912
42
43
  singlestoredb/http/connection.py,sha256=Ykpr9aAjmQUgQwQEx_7QykjjfnwsUymqrYEqiTEApzI,29448
43
- singlestoredb/mysql/protocol.py,sha256=F7OImNQtumq4oNcNHAHo5H6Nj0oTvJhnM7w75U995Cc,12081
44
+ singlestoredb/mysql/protocol.py,sha256=TfG247zY7ngg03JLDzANYwpc9SIlJa_fGOeMF1lRRG0,12138
44
45
  singlestoredb/mysql/cursors.py,sha256=FTHY_olVz1JZv52nKO5ZaDCWKeJsWM2AWqVNYgRenIE,21092
45
46
  singlestoredb/mysql/__init__.py,sha256=rrpuvKqM8HTGYtlFnQQjRvRWGF52fOrvWM5mnPFhyI8,4363
46
47
  singlestoredb/mysql/times.py,sha256=xBsPnBbHuCXUk9n6dCglG8ZwCAqQ7g2oxfGPE9xeqmE,435
47
- singlestoredb/mysql/connection.py,sha256=i7vd1_2Wv8A9Ji-UsojyJc5b1jpD4OXaK9Xq5OqzeF4,58930
48
+ singlestoredb/mysql/connection.py,sha256=0ZtbXiX1tho471W36OVj3Z0baObnIQ7sISGxRzttu-A,58987
48
49
  singlestoredb/mysql/charset.py,sha256=-Er76WDWX1aXAAsqxJOyQXsnCHv4Shx16lwQj3xEgIw,10324
49
50
  singlestoredb/mysql/converters.py,sha256=RNpk86JQEut-xrpQ1HF-Yt5nDeemckyRLkpaGvVqwhI,5630
50
51
  singlestoredb/mysql/optionfile.py,sha256=8VZmyCu9QCoVCZXIT6Jt9CCYcJs2FantKwJUSPsBhGs,589
51
52
  singlestoredb/mysql/err.py,sha256=RAaP4sXiuz1icYAXJcc6FfqC5HQHt4NCYX3bxpFMzDk,2342
52
- singlestoredb/mysql/_auth.py,sha256=oB6uD4MtIiVtIoAkqOVtU6s7zYDW-dORYdXUtKfndqM,7985
53
+ singlestoredb/mysql/_auth.py,sha256=AugRitoUwgRIDFuJxuAH4MWIAmckY7Ji2pP6r_Ng9dY,8043
53
54
  singlestoredb/mysql/constants/FLAG.py,sha256=Od4-Hqn0uPV-EiZodIYqdk4W1KbwZn2yUC9cUUbjvRI,229
54
55
  singlestoredb/mysql/constants/COMMAND.py,sha256=u0ci3HoEOiJBrT4QIpEZI3jx9Cv2OtNNIom_MALNvaM,694
55
56
  singlestoredb/mysql/constants/CLIENT.py,sha256=h3phmMVBs_CpGUnlWbE4ypkd9J4EtXwnfzTpyrvKMlA,893
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.38.4)
2
+ Generator: bdist_wheel (0.42.0)
3
3
  Root-Is-Purelib: false
4
4
  Tag: cp36-abi3-macosx_10_9_universal2
5
5