singlestoredb 1.6.2__py3-none-any.whl → 1.6.3__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 CHANGED
@@ -13,7 +13,7 @@ Examples
13
13
 
14
14
  """
15
15
 
16
- __version__ = '1.6.2'
16
+ __version__ = '1.6.3'
17
17
 
18
18
  from typing import Any
19
19
 
singlestoredb/config.py CHANGED
@@ -103,6 +103,13 @@ register_option(
103
103
  environ='SINGLESTOREDB_MULTI_STATEMENTS',
104
104
  )
105
105
 
106
+ register_option(
107
+ 'client_found_rows', 'bool', check_bool, False,
108
+ 'Should affected_rows in OK_PACKET indicate the '
109
+ 'number of matched rows instead of changed?',
110
+ environ='SINGLESTOREDB_CLIENT_FOUND_ROWS',
111
+ )
112
+
106
113
  register_option(
107
114
  'ssl_key', 'str', check_str, None,
108
115
  'File containing SSL key',
@@ -1298,6 +1298,7 @@ def connect(
1298
1298
  program_name: Optional[str] = None,
1299
1299
  conn_attrs: Optional[Dict[str, str]] = None,
1300
1300
  multi_statements: Optional[bool] = None,
1301
+ client_found_rows: Optional[bool] = None,
1301
1302
  connect_timeout: Optional[int] = None,
1302
1303
  nan_as_null: Optional[bool] = None,
1303
1304
  inf_as_null: Optional[bool] = None,
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env python3
2
2
  import abc
3
3
  import functools
4
+ import os
4
5
  import re
5
6
  import sys
6
7
  import textwrap
@@ -543,6 +544,7 @@ class SQLHandler(NodeVisitor):
543
544
 
544
545
  _grammar: str = CORE_GRAMMAR
545
546
  _is_compiled: bool = False
547
+ _enabled: bool = True
546
548
 
547
549
  def __init__(self, connection: Connection):
548
550
  self.connection = connection
@@ -581,6 +583,11 @@ class SQLHandler(NodeVisitor):
581
583
  Overwrite an existing command with the same name?
582
584
 
583
585
  """
586
+ if not cls._enabled and \
587
+ os.environ.get('SINGLESTOREDB_FUSION_ENABLE_HIDDEN', '0').lower() not in \
588
+ ['1', 't', 'true', 'y', 'yes']:
589
+ return
590
+
584
591
  from . import registry
585
592
  cls.compile()
586
593
  registry.register_handler(cls, overwrite=overwrite)
@@ -122,6 +122,8 @@ class ScheduleJobHandler(SQLHandler):
122
122
  ;
123
123
  """
124
124
 
125
+ _enabled = False
126
+
125
127
  def run(self, params: Dict[str, Any]) -> Optional[FusionSQLResult]:
126
128
  res = FusionSQLResult()
127
129
  res.add_field('JobID', result.STRING)
@@ -222,6 +224,8 @@ class RunJobHandler(SQLHandler):
222
224
 
223
225
  """
224
226
 
227
+ _enabled = False
228
+
225
229
  def run(self, params: Dict[str, Any]) -> Optional[FusionSQLResult]:
226
230
  res = FusionSQLResult()
227
231
  res.add_field('JobID', result.STRING)
@@ -284,6 +288,8 @@ class WaitOnJobsHandler(SQLHandler):
284
288
 
285
289
  """
286
290
 
291
+ _enabled = False
292
+
287
293
  def run(self, params: Dict[str, Any]) -> Optional[FusionSQLResult]:
288
294
  res = FusionSQLResult()
289
295
  res.add_field('Success', result.BOOL)
@@ -353,6 +359,8 @@ class ShowJobsHandler(SQLHandler):
353
359
 
354
360
  """
355
361
 
362
+ _enabled = False
363
+
356
364
  def run(self, params: Dict[str, Any]) -> Optional[FusionSQLResult]:
357
365
  res = FusionSQLResult()
358
366
  res.add_field('JobID', result.STRING)
@@ -484,6 +492,8 @@ class ShowJobExecutionsHandler(SQLHandler):
484
492
  EXTENDED;
485
493
  """
486
494
 
495
+ _enabled = False
496
+
487
497
  def run(self, params: Dict[str, Any]) -> Optional[FusionSQLResult]:
488
498
  res = FusionSQLResult()
489
499
  res.add_field('ExecutionID', result.STRING)
@@ -554,6 +564,8 @@ class ShowJobParametersHandler(SQLHandler):
554
564
  SHOW JOB PARAMETERS FOR 'job1';
555
565
  """
556
566
 
567
+ _enabled = False
568
+
557
569
  def run(self, params: Dict[str, Any]) -> Optional[FusionSQLResult]:
558
570
  res = FusionSQLResult()
559
571
  res.add_field('Name', result.STRING)
@@ -594,6 +606,8 @@ class ShowJobRuntimesHandler(SQLHandler):
594
606
  SHOW JOB RUNTIMES;
595
607
  """
596
608
 
609
+ _enabled = False
610
+
597
611
  def run(self, params: Dict[str, Any]) -> Optional[FusionSQLResult]:
598
612
  res = FusionSQLResult()
599
613
  res.add_field('Name', result.STRING)
@@ -639,6 +653,8 @@ class DropJobHandler(SQLHandler):
639
653
  DROP JOBS 'job1', 'job2';
640
654
  """
641
655
 
656
+ _enabled = False
657
+
642
658
  def run(self, params: Dict[str, Any]) -> Optional[FusionSQLResult]:
643
659
  res = FusionSQLResult()
644
660
  res.add_field('JobID', result.STRING)
@@ -386,6 +386,8 @@ class Cursor(connection.Cursor):
386
386
  """
387
387
  if self._connection is None:
388
388
  raise ProgrammingError(errno=2048, msg='Connection is closed.')
389
+ if 'timeout' not in kwargs:
390
+ kwargs['timeout'] = self._connection.connection_params['connect_timeout']
389
391
  return self._connection._post(path, *args, **kwargs)
390
392
 
391
393
  def callproc(
@@ -1126,9 +1128,6 @@ class Connection(connection.Connection):
1126
1128
 
1127
1129
  self._sync_connection(kwargs)
1128
1130
 
1129
- if 'timeout' not in kwargs:
1130
- kwargs['timeout'] = get_option('connect_timeout')
1131
-
1132
1131
  return self._sess.post(urljoin(self._url, path), *args, **kwargs)
1133
1132
 
1134
1133
  def close(self) -> None:
@@ -347,6 +347,7 @@ class Connection(BaseConnection):
347
347
  driver=None, # internal use
348
348
  conn_attrs=None,
349
349
  multi_statements=None,
350
+ client_found_rows=None,
350
351
  nan_as_null=None,
351
352
  inf_as_null=None,
352
353
  encoding_errors='strict',
@@ -380,6 +381,8 @@ class Connection(BaseConnection):
380
381
  client_flag |= CLIENT.LOCAL_FILES
381
382
  if multi_statements:
382
383
  client_flag |= CLIENT.MULTI_STATEMENTS
384
+ if client_found_rows:
385
+ client_flag |= CLIENT.FOUND_ROWS
383
386
 
384
387
  if read_default_group and not read_default_file:
385
388
  if sys.platform.startswith('win'):
@@ -2776,6 +2776,39 @@ class TestConnection(unittest.TestCase):
2776
2776
  self.assertEqual([(2,)], list(cur))
2777
2777
  self.assertIsNone(cur.nextset())
2778
2778
 
2779
+ def test_client_found_rows(self):
2780
+ if self.conn.driver not in ['http', 'https']:
2781
+ with s2.connect(database=type(self).dbname, client_found_rows=False) as conn:
2782
+ with conn.cursor() as cur:
2783
+ tag = str(uuid.uuid4()).replace('-', '_')
2784
+ table_name = f'test_client_found_rows_{tag}'
2785
+ cur.execute(f"CREATE TABLE {table_name} (id BIGINT \
2786
+ PRIMARY KEY, s TEXT DEFAULT 'def');")
2787
+ cur.execute(f'INSERT INTO {table_name} (id) \
2788
+ VALUES (1), (2), (3);')
2789
+ cur.execute(f"UPDATE {table_name} SET s = 'def' \
2790
+ WHERE id = 1;")
2791
+ # UPDATE statement above is not changing any rows,
2792
+ # so affected_rows is 0 if client_found_rows is False (default)
2793
+ self.assertEqual(0, conn.affected_rows())
2794
+ cur.execute(f'DROP TABLE {table_name};')
2795
+
2796
+ with s2.connect(database=type(self).dbname, client_found_rows=True) as conn:
2797
+ with conn.cursor() as cur:
2798
+ tag = str(uuid.uuid4()).replace('-', '_')
2799
+ table_name = f'test_client_found_rows_{tag}'
2800
+ cur.execute(f"CREATE TABLE {table_name} (id BIGINT \
2801
+ PRIMARY KEY, s TEXT DEFAULT 'def');")
2802
+ cur.execute(f'INSERT INTO {table_name} (id) \
2803
+ VALUES (1), (2), (3);')
2804
+ cur.execute(f"UPDATE {table_name} SET s = 'def' \
2805
+ WHERE id = 1;")
2806
+ # UPDATE statement above is not changing any rows,
2807
+ # but affected_rows is 1 as 1 row is subject to update, and
2808
+ # this is what affected_rows return when client_found_rows is True
2809
+ self.assertEqual(1, conn.affected_rows())
2810
+ cur.execute(f'DROP TABLE {table_name};')
2811
+
2779
2812
  def test_connect_timeout(self):
2780
2813
  with s2.connect(database=type(self).dbname, connect_timeout=8) as conn:
2781
2814
  with conn.cursor() as cur:
@@ -465,6 +465,10 @@ class TestWorkspaceFusion(unittest.TestCase):
465
465
  pass
466
466
 
467
467
 
468
+ @unittest.skipIf(
469
+ os.environ.get('SINGLESTOREDB_FUSION_ENABLE_HIDDEN', '0') == '0',
470
+ 'Hidden Fusion commands are not enabled.',
471
+ )
468
472
  @pytest.mark.management
469
473
  class TestJobsFusion(unittest.TestCase):
470
474
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: singlestoredb
3
- Version: 1.6.2
3
+ Version: 1.6.3
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,7 +1,7 @@
1
- singlestoredb/__init__.py,sha256=k-LJN-GeJeTKCSDSlMPr4-mM2_k1vOO643_TA8IyyOs,1634
1
+ singlestoredb/__init__.py,sha256=sef5VjPuehPFp3gVst6kSbrD0vAleAqwW0V7fClxr9Q,1634
2
2
  singlestoredb/auth.py,sha256=u8D9tpKzrqa4ssaHjyZnGDX1q8XBpGtuoOkTkSv7B28,7599
3
- singlestoredb/config.py,sha256=0qU2lweqHIA5yuV0ZN_JS-cZCfLIxIHutgS2YKRuwXw,12067
4
- singlestoredb/connection.py,sha256=Gzq38vG8lXTx5v2WvHkdMg-abSTS6lguTsVMxbYHZmQ,45306
3
+ singlestoredb/config.py,sha256=NtONv4Etpraoy1nenHqRAS08xHJZmho00J95uDjLxQM,12290
4
+ singlestoredb/connection.py,sha256=x5lINBa9kB_GoEEeL2uUZi9G8pNwKuFtA1uqJirR6HI,45352
5
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
@@ -22,16 +22,16 @@ singlestoredb/functions/ext/rowdat_1.py,sha256=JgKRsVSQYczFD6cmo2xLilbNPYpyLL2tP
22
22
  singlestoredb/functions/ext/utils.py,sha256=2-B8YU_Iekv8JcpI-ochs9TIeuyatLaLAH-AyYyUUIg,5311
23
23
  singlestoredb/fusion/__init__.py,sha256=Qo7SuqGw-l-vE8-EI2jhm6hXJkYfOLUKIws9c7LFNX0,356
24
24
  singlestoredb/fusion/graphql.py,sha256=ZA3HcDq5rER-dCEavwTqnF7KM0D2LCYIY7nLQk7lSso,5207
25
- singlestoredb/fusion/handler.py,sha256=6OmDzGUDl98bmQm1XjLIiK_6zi14qIz_XE-PmCBbX-Y,25155
25
+ singlestoredb/fusion/handler.py,sha256=A0fdo2pNtv5E5SPR9ufCIGeKwgiH3V2b4uqA4luYLKM,25384
26
26
  singlestoredb/fusion/registry.py,sha256=jjdRTYZ3ylhy6gAoW5xBj0tkxGFBT-2yLQ0tztTgDIY,6112
27
27
  singlestoredb/fusion/result.py,sha256=Bd3KbRpqWqQcWp_Chd4bzBy8Kfc8nXLS_Pn_GGbPO6o,11772
28
28
  singlestoredb/fusion/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- singlestoredb/fusion/handlers/job.py,sha256=EfAahiQkhrNUbO8jxCPMHtUhntAZOK2xsd1D0dSTMZY,21109
29
+ singlestoredb/fusion/handlers/job.py,sha256=KyAC7A28_7hd9eY1lICfQR7rQrDJ6S8G-Y0PeoLYey8,21285
30
30
  singlestoredb/fusion/handlers/stage.py,sha256=4BSwqcmA4PI3oksTdYaTmQ6bY-AzmL0mZfGnP3U0ldM,13643
31
31
  singlestoredb/fusion/handlers/utils.py,sha256=oYbf13Y3orEkJfHMNnO7B_W1anEdK-0S9vVVkF2pPFk,5109
32
32
  singlestoredb/fusion/handlers/workspace.py,sha256=4xN2TFO4yF7KZB2Fcht7IuvoDdAT6fDfDLjixiHZN8w,27506
33
33
  singlestoredb/http/__init__.py,sha256=A_2ZUCCpvRYIA6YDpPy57wL5R1eZ5SfP6I1To5nfJ2s,912
34
- singlestoredb/http/connection.py,sha256=T2NrL7XV30eQRdrcbP_IY8c3ZOV6Th4KQiuleW4tHUE,39450
34
+ singlestoredb/http/connection.py,sha256=dU0a72pMpyq9l9ADKs5jpB-GAJScBxgd83NOlGreIdc,39473
35
35
  singlestoredb/management/__init__.py,sha256=mhWXjLhp5-t8dhl0vl7SjayKrvJlDb5_hl1YWvDgiMA,237
36
36
  singlestoredb/management/billing_usage.py,sha256=9ighjIpcopgIyJOktBYQ6pahBZmWGHOPyyCW4gu9FGs,3735
37
37
  singlestoredb/management/cluster.py,sha256=i23Smr1PBrDZ8NO_VPd_-bEYkyHvVe9CCRGUjHn_1yQ,14362
@@ -44,7 +44,7 @@ singlestoredb/management/workspace.py,sha256=9oamNIaE5vLZNAlpl5SK-xu27qPqx2Ff3ZI
44
44
  singlestoredb/mysql/__init__.py,sha256=olUTAvkiERhDW41JXQMawkg-i0tvBEkoTkII1tt6lxU,4492
45
45
  singlestoredb/mysql/_auth.py,sha256=AugRitoUwgRIDFuJxuAH4MWIAmckY7Ji2pP6r_Ng9dY,8043
46
46
  singlestoredb/mysql/charset.py,sha256=-FlONDS_oAUF5B3mIgeHBPb_SCt4zHD33arUeBNctU0,10510
47
- singlestoredb/mysql/connection.py,sha256=NpehiK8NTPSc2KH4toLqik3e63XMZSov4s9gOVcBfko,72260
47
+ singlestoredb/mysql/connection.py,sha256=6N7ZG3rNMrpQhv4eixA686NdJ5GBe4HknSpy46qlZ9g,72367
48
48
  singlestoredb/mysql/converters.py,sha256=CVe8SDmjbIAhy1xpQ2N5OKWw6t5eWpw-EU3QTlA0Hh0,7500
49
49
  singlestoredb/mysql/cursors.py,sha256=Eqe7jITRvOo4P_TxIarTumg_2PG1DcCfZ4Uo9IFdDa8,26794
50
50
  singlestoredb/mysql/err.py,sha256=-m5rqXi8yhq6b8SCEJ2h0E5Rudh_15dlAU_WbJ1YrM8,2388
@@ -92,12 +92,12 @@ singlestoredb/tests/test.sql,sha256=dfMehVCQ9wObSVTQKyQi-fRFDZeqRxV4Cj8doBCPEFM,
92
92
  singlestoredb/tests/test2.sql,sha256=D4U2GSlOVeo39U8-RMM4YziJzYFfi4Ztm2YXJVJVAS8,37
93
93
  singlestoredb/tests/test_basics.py,sha256=1__lEF7FmQF4_pFi5R53TtJidtQznmQ592Ci6aDVgrc,46368
94
94
  singlestoredb/tests/test_config.py,sha256=63lyIQ2KrvGE6C9403B_4Mc90mX4tp42ys5Bih2sXrE,11184
95
- singlestoredb/tests/test_connection.py,sha256=ZmhnECusipQAuc6bfZOfMMZULrtxUhnxjxNNSSi6xH4,117697
95
+ singlestoredb/tests/test_connection.py,sha256=fvn-kPdeIMI9RGNz0dNk5ZmTCep1amwWQDHYfPdqO60,119699
96
96
  singlestoredb/tests/test_dbapi.py,sha256=IKq5Hcwx8WikASP8_AB5fo3TXv7ryWPCVGonoly00gI,652
97
97
  singlestoredb/tests/test_exceptions.py,sha256=tfr_8X2w1UmG4nkSBzWGB0C7ehrf1GAVgj6_ODaG-TM,1131
98
98
  singlestoredb/tests/test_ext_func.py,sha256=OWd-CJ1Owhx72nikSWWEF2EQFCJk7vEXZM2Oy9EbYQo,37357
99
99
  singlestoredb/tests/test_ext_func_data.py,sha256=yTADD93nPxX6_rZXXLZaOWEI_yPvYyir9psn5PK9ctU,47695
100
- singlestoredb/tests/test_fusion.py,sha256=W3aRfBeu8HBGm1CIQWFIeWUPBUlfHBCbJy8vejPHdRs,23828
100
+ singlestoredb/tests/test_fusion.py,sha256=W79zv1XcPiiYIYAGtUxLadAMwcJlo2QMmGgU_6-juDk,23965
101
101
  singlestoredb/tests/test_http.py,sha256=RXasTqBWRn__omj0eLFTJYIbZjd0PPdIV2d4Cqz0MC8,8580
102
102
  singlestoredb/tests/test_management.py,sha256=89hKu82qiH1YTbLzKl5FOPEapNB5qo8k06d3fkoYajc,34304
103
103
  singlestoredb/tests/test_plugin.py,sha256=qpO9wmWc62VaijN1sJ97YSYIX7I7Y5C6sY-WzwrutDQ,812
@@ -116,9 +116,9 @@ singlestoredb/utils/events.py,sha256=9IB84T3pKQjs7aaoSSJCw7soNngnhoTDWIC52M51R9Y
116
116
  singlestoredb/utils/mogrify.py,sha256=-a56IF70U6CkfadeaZgfjRSVsAD3PuqRrzPpjZlgbwY,4050
117
117
  singlestoredb/utils/results.py,sha256=bJtaUaDiFq26IsPAKZ2FHGB7csMn94EAxLKrP4HaEEA,15277
118
118
  singlestoredb/utils/xdict.py,sha256=S9HKgrPrnu_6b7iOwa2KrW8CmU1Uqx0BWdEyogFzWbE,12896
119
- singlestoredb-1.6.2.dist-info/LICENSE,sha256=Mlq78idURT-9G026aMYswwwnnrLcgzTLuXeAs5hjDLM,11341
120
- singlestoredb-1.6.2.dist-info/METADATA,sha256=K8wvPnmdbQcQV7pvRJARTF7L_7f9sdYct2SVUyAOoE4,5557
121
- singlestoredb-1.6.2.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
122
- singlestoredb-1.6.2.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
123
- singlestoredb-1.6.2.dist-info/top_level.txt,sha256=eet8bVPNRqiGeY0PrO5ERH2UpamwlrKHEQCffz4dOh8,14
124
- singlestoredb-1.6.2.dist-info/RECORD,,
119
+ singlestoredb-1.6.3.dist-info/LICENSE,sha256=Mlq78idURT-9G026aMYswwwnnrLcgzTLuXeAs5hjDLM,11341
120
+ singlestoredb-1.6.3.dist-info/METADATA,sha256=bsqO01qJefvBvYUXkintDhG3QHWajE96cDn5Ez1zmhI,5557
121
+ singlestoredb-1.6.3.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
122
+ singlestoredb-1.6.3.dist-info/entry_points.txt,sha256=bSLaTWB5zGjpVYPAaI46MkkDup0su-eb3uAhCNYuRV0,48
123
+ singlestoredb-1.6.3.dist-info/top_level.txt,sha256=eet8bVPNRqiGeY0PrO5ERH2UpamwlrKHEQCffz4dOh8,14
124
+ singlestoredb-1.6.3.dist-info/RECORD,,