clickhouse-driver 0.2.6__cp310-cp310-macosx_11_0_arm64.whl → 0.2.7__cp310-cp310-macosx_11_0_arm64.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 clickhouse-driver might be problematic. Click here for more details.

@@ -3,7 +3,7 @@ from .client import Client
3
3
  from .dbapi import connect
4
4
 
5
5
 
6
- VERSION = (0, 2, 6)
6
+ VERSION = (0, 2, 7)
7
7
  __version__ = '.'.join(str(x) for x in VERSION)
8
8
 
9
9
  __all__ = ['Client', 'connect']
@@ -63,6 +63,11 @@ class Client(object):
63
63
  tuple set ``namedtuple_as_json`` to ``False``.
64
64
  Default: True.
65
65
  New in version *0.2.6*.
66
+ * ``server_side_params`` -- Species on which side query parameters
67
+ should be rendered into placeholders.
68
+ Default: False. Means that parameters are rendered
69
+ on driver's side.
70
+ New in version *0.2.7*.
66
71
  """
67
72
 
68
73
  available_client_settings = (
@@ -74,7 +79,8 @@ class Client(object):
74
79
  'opentelemetry_tracestate',
75
80
  'quota_key',
76
81
  'input_format_null_as_default',
77
- 'namedtuple_as_json'
82
+ 'namedtuple_as_json',
83
+ 'server_side_params'
78
84
  )
79
85
 
80
86
  def __init__(self, *args, **kwargs):
@@ -107,6 +113,9 @@ class Client(object):
107
113
  ),
108
114
  'namedtuple_as_json': self.settings.pop(
109
115
  'namedtuple_as_json', True
116
+ ),
117
+ 'server_side_params': self.settings.pop(
118
+ 'server_side_params', False
110
119
  )
111
120
  }
112
121
 
@@ -592,12 +601,12 @@ class Client(object):
592
601
  self.connection.send_query(query_without_data, query_id=query_id)
593
602
  self.connection.send_external_tables(external_tables,
594
603
  types_check=types_check)
595
-
596
604
  sample_block = self.receive_sample_block()
605
+
597
606
  if sample_block:
598
607
  rv = self.send_data(sample_block, data,
599
608
  types_check=types_check, columnar=columnar)
600
- self.receive_end_of_query()
609
+ self.receive_end_of_insert_query()
601
610
  return rv
602
611
 
603
612
  def receive_sample_block(self):
@@ -651,8 +660,15 @@ class Client(object):
651
660
  self.connection.send_data(block)
652
661
  inserted_rows += block.num_rows
653
662
 
663
+ # Starting from the specific revision there are profile events
664
+ # sent by server in response to each inserted block
665
+ self.receive_profile_events()
666
+
654
667
  # Empty block means end of data.
655
668
  self.connection.send_data(block_cls())
669
+ # If enabled by revision profile events are also sent after empty block
670
+ self.receive_profile_events()
671
+
656
672
  return inserted_rows
657
673
 
658
674
  def receive_end_of_query(self):
@@ -663,7 +679,7 @@ class Client(object):
663
679
  break
664
680
 
665
681
  elif packet.type == ServerPacketTypes.PROGRESS:
666
- continue
682
+ self.last_query.store_progress(packet.progress)
667
683
 
668
684
  elif packet.type == ServerPacketTypes.EXCEPTION:
669
685
  raise packet.exception
@@ -675,11 +691,64 @@ class Client(object):
675
691
  pass
676
692
 
677
693
  elif packet.type == ServerPacketTypes.PROFILE_EVENTS:
678
- pass
694
+ self.last_query.store_profile(packet.profile_info)
695
+
696
+ else:
697
+ message = self.connection.unexpected_packet_message(
698
+ 'Exception, EndOfStream, Progress, TableColumns, '
699
+ 'ProfileEvents or Log', packet.type
700
+ )
701
+ raise errors.UnexpectedPacketFromServerError(message)
702
+
703
+ def receive_end_of_insert_query(self):
704
+ while True:
705
+ packet = self.connection.receive_packet()
706
+
707
+ if packet.type == ServerPacketTypes.END_OF_STREAM:
708
+ break
709
+
710
+ elif packet.type == ServerPacketTypes.LOG:
711
+ log_block(packet.block)
712
+
713
+ elif packet.type == ServerPacketTypes.PROGRESS:
714
+ self.last_query.store_progress(packet.progress)
715
+
716
+ elif packet.type == ServerPacketTypes.EXCEPTION:
717
+ raise packet.exception
679
718
 
680
719
  else:
681
720
  message = self.connection.unexpected_packet_message(
682
- 'Exception, EndOfStream or Log', packet.type
721
+ 'EndOfStream, Log, Progress or Exception', packet.type
722
+ )
723
+ raise errors.UnexpectedPacketFromServerError(message)
724
+
725
+ def receive_profile_events(self):
726
+ revision = self.connection.server_info.used_revision
727
+ if (
728
+ revision <
729
+ defines.DBMS_MIN_PROTOCOL_VERSION_WITH_PROFILE_EVENTS_IN_INSERT
730
+ ):
731
+ return None
732
+
733
+ while True:
734
+ packet = self.connection.receive_packet()
735
+
736
+ if packet.type == ServerPacketTypes.PROFILE_EVENTS:
737
+ self.last_query.store_profile(packet.profile_info)
738
+ break
739
+
740
+ elif packet.type == ServerPacketTypes.PROGRESS:
741
+ self.last_query.store_progress(packet.progress)
742
+
743
+ elif packet.type == ServerPacketTypes.LOG:
744
+ log_block(packet.block)
745
+
746
+ elif packet.type == ServerPacketTypes.EXCEPTION:
747
+ raise packet.exception
748
+
749
+ else:
750
+ message = self.connection.unexpected_packet_message(
751
+ 'ProfileEvents, Progress, Log or Exception', packet.type
683
752
  )
684
753
  raise errors.UnexpectedPacketFromServerError(message)
685
754
 
@@ -706,6 +775,10 @@ class Client(object):
706
775
  # prints: SELECT 1234, 'bar'
707
776
  print(substituted_query)
708
777
  """
778
+ # In case of server side templating we don't substitute here.
779
+ if self.connection.context.client_settings['server_side_params']:
780
+ return query
781
+
709
782
  if not isinstance(params, dict):
710
783
  raise ValueError('Parameters are expected in dict form')
711
784
 
@@ -6,7 +6,7 @@ from .base import FormatColumn
6
6
  epoch_start = date(1970, 1, 1)
7
7
  epoch_end = date(2149, 6, 6)
8
8
 
9
- epoch_start_date32 = date(1925, 1, 1)
9
+ epoch_start_date32 = date(1900, 1, 1)
10
10
  epoch_end_date32 = date(2283, 11, 11)
11
11
 
12
12
 
@@ -34,7 +34,7 @@ class DateColumn(FormatColumn):
34
34
  items[i] = null_value
35
35
  continue
36
36
 
37
- if type(item) != date:
37
+ if item is not date:
38
38
  item = date(item.year, item.month, item.day)
39
39
 
40
40
  if min_value <= item <= max_value:
@@ -54,7 +54,7 @@ class UUIDColumn(FormatColumn):
54
54
 
55
55
  try:
56
56
  if not isinstance(item, UUID):
57
- item = UUID(item)
57
+ item = UUID(int=item) if item is null_value else UUID(item)
58
58
 
59
59
  except ValueError:
60
60
  raise errors.CannotParseUuidError(
@@ -20,7 +20,7 @@ from .log import log_block
20
20
  from .progress import Progress
21
21
  from .protocol import Compression, ClientPacketTypes, ServerPacketTypes
22
22
  from .queryprocessingstage import QueryProcessingStage
23
- from .reader import read_binary_str
23
+ from .reader import read_binary_str, read_binary_uint64
24
24
  from .readhelpers import read_exception
25
25
  from .settings.writer import write_settings, SettingsFlags
26
26
  from .streams.native import BlockInputStream, BlockOutputStream
@@ -303,6 +303,7 @@ class Connection(object):
303
303
 
304
304
  version = ssl_options.get('ssl_version', ssl.PROTOCOL_TLS)
305
305
  context = ssl.SSLContext(version)
306
+ context.check_hostname = self.verify_cert
306
307
 
307
308
  if 'ca_certs' in ssl_options:
308
309
  context.load_verify_locations(ssl_options['ca_certs'])
@@ -496,6 +497,17 @@ class Connection(object):
496
497
  defines.DBMS_MIN_REVISION_WITH_VERSION_PATCH:
497
498
  server_version_patch = read_varint(self.fin)
498
499
 
500
+ if used_revision >= defines. \
501
+ DBMS_MIN_PROTOCOL_VERSION_WITH_PASSWORD_COMPLEXITY_RULES:
502
+ rules_size = read_varint(self.fin)
503
+ for _i in range(rules_size):
504
+ read_binary_str(self.fin) # original_pattern
505
+ read_binary_str(self.fin) # exception_message
506
+
507
+ if used_revision >= defines. \
508
+ DBMS_MIN_REVISION_WITH_INTERSERVER_SECRET_V2:
509
+ read_binary_uint64(self.fin) # read_nonce
510
+
499
511
  self.server_info = ServerInfo(
500
512
  server_name, server_version_major, server_version_minor,
501
513
  server_version_patch, server_revision,
@@ -702,10 +714,13 @@ class Connection(object):
702
714
  write_binary_str(query, self.fout)
703
715
 
704
716
  if revision >= defines.DBMS_MIN_PROTOCOL_VERSION_WITH_PARAMETERS:
705
- # Always settings_as_strings = True
706
- escaped = escape_params(
707
- params or {}, self.context, for_server=True
708
- )
717
+ if self.context.client_settings['server_side_params']:
718
+ # Always settings_as_strings = True
719
+ escaped = escape_params(
720
+ params or {}, self.context, for_server=True
721
+ )
722
+ else:
723
+ escaped = {}
709
724
  write_settings(escaped, self.fout, True, SettingsFlags.CUSTOM)
710
725
 
711
726
  logger.debug('Query: %s', query)
@@ -26,9 +26,13 @@ DBMS_MIN_PROTOCOL_VERSION_WITH_INITIAL_QUERY_START_TIME = 54449
26
26
  DBMS_MIN_PROTOCOL_VERSION_WITH_INCREMENTAL_PROFILE_EVENTS = 54451
27
27
  DBMS_MIN_REVISION_WITH_PARALLEL_REPLICAS = 54453
28
28
  DBMS_MIN_REVISION_WITH_CUSTOM_SERIALIZATION = 54454
29
+ DBMS_MIN_PROTOCOL_VERSION_WITH_PROFILE_EVENTS_IN_INSERT = 54456
29
30
  DBMS_MIN_PROTOCOL_VERSION_WITH_ADDENDUM = 54458
30
31
  DBMS_MIN_PROTOCOL_VERSION_WITH_QUOTA_KEY = 54458
31
32
  DBMS_MIN_PROTOCOL_VERSION_WITH_PARAMETERS = 54459
33
+ DBMS_MIN_PROTOCOL_VERSION_WITH_SERVER_QUERY_TIME_IN_PROGRESS = 54460
34
+ DBMS_MIN_PROTOCOL_VERSION_WITH_PASSWORD_COMPLEXITY_RULES = 54461
35
+ DBMS_MIN_REVISION_WITH_INTERSERVER_SECRET_V2 = 54462
32
36
 
33
37
  # Timeouts
34
38
  DBMS_DEFAULT_CONNECT_TIMEOUT_SEC = 10
@@ -44,7 +48,7 @@ CLIENT_NAME = 'python-driver'
44
48
  CLIENT_VERSION_MAJOR = 20
45
49
  CLIENT_VERSION_MINOR = 10
46
50
  CLIENT_VERSION_PATCH = 2
47
- CLIENT_REVISION = DBMS_MIN_PROTOCOL_VERSION_WITH_PARAMETERS
51
+ CLIENT_REVISION = DBMS_MIN_REVISION_WITH_INTERSERVER_SECRET_V2
48
52
 
49
53
  BUFFER_SIZE = 1048576
50
54
 
clickhouse_driver/log.py CHANGED
@@ -2,7 +2,8 @@ import logging
2
2
 
3
3
  logger = logging.getLogger(__name__)
4
4
 
5
-
5
+ # Keep in sync with ClickHouse priorities
6
+ # https://github.com/ClickHouse/ClickHouse/blob/master/src/Interpreters/InternalTextLogsQueue.cpp
6
7
  log_priorities = (
7
8
  'Unknown',
8
9
  'Fatal',
@@ -12,9 +13,12 @@ log_priorities = (
12
13
  'Notice',
13
14
  'Information',
14
15
  'Debug',
15
- 'Trace'
16
+ 'Trace',
17
+ 'Test',
16
18
  )
17
19
 
20
+ num_priorities = len(log_priorities)
21
+
18
22
 
19
23
  def log_block(block):
20
24
  if block is None:
@@ -25,7 +29,7 @@ def log_block(block):
25
29
  for row in block.get_rows():
26
30
  row = dict(zip(column_names, row))
27
31
 
28
- if 1 <= row['priority'] <= 8:
32
+ if 1 <= row['priority'] <= num_priorities:
29
33
  priority = log_priorities[row['priority']]
30
34
  else:
31
35
  priority = row[0]
@@ -9,6 +9,7 @@ class Progress(object):
9
9
  self.total_rows = 0
10
10
  self.written_rows = 0
11
11
  self.written_bytes = 0
12
+ self.elapsed_ns = 0
12
13
 
13
14
  super(Progress, self).__init__()
14
15
 
@@ -24,9 +25,14 @@ class Progress(object):
24
25
  self.written_rows = read_varint(fin)
25
26
  self.written_bytes = read_varint(fin)
26
27
 
28
+ if revision >= defines. \
29
+ DBMS_MIN_PROTOCOL_VERSION_WITH_SERVER_QUERY_TIME_IN_PROGRESS:
30
+ self.elapsed_ns = read_varint(fin)
31
+
27
32
  def increment(self, another_progress):
28
33
  self.rows += another_progress.rows
29
34
  self.bytes += another_progress.bytes
30
35
  self.total_rows += another_progress.total_rows
31
36
  self.written_rows += another_progress.written_rows
32
37
  self.written_bytes += another_progress.written_bytes
38
+ self.elapsed_ns += another_progress.elapsed_ns
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: clickhouse-driver
3
- Version: 0.2.6
3
+ Version: 0.2.7
4
4
  Summary: Python driver with native interface for ClickHouse
5
5
  Home-page: https://github.com/mymarilyn/clickhouse-driver
6
6
  Author: Konstantin Lebedev
@@ -1,22 +1,22 @@
1
- clickhouse_driver/varint.cpython-310-darwin.so,sha256=L0N-J74ycsPkUdk65ze1gQBVzoYOkWkzPwINnWHqoWE,81833
1
+ clickhouse_driver/varint.cpython-310-darwin.so,sha256=RAIg4uHztyAA4sP3yYxLhK7UGwe2mTZVtElcPrnFBCQ,81849
2
2
  clickhouse_driver/blockstreamprofileinfo.py,sha256=nYx9QXWAS8aPiRbtAzwLRT5JIlJ8S103JMkudncwpFg,712
3
- clickhouse_driver/log.py,sha256=VLeOYXn5DW2hJ53m2w5bPsMrWG5cWnq5whE4e6euK_M,888
3
+ clickhouse_driver/log.py,sha256=P9VS_YDY3a4JQsNOeUNNK0L1AAallTC1GF4FG5gCrac,1091
4
4
  clickhouse_driver/queryprocessingstage.py,sha256=lbV-bB5jWUp0hqYBTsUcRYkJhCgCTfN2G21AykMoAp0,186
5
5
  clickhouse_driver/protocol.py,sha256=ZRJuawN_v8wXFrHrcpSiBqu7idKsPd3tQnCcDuTlIw8,2561
6
- clickhouse_driver/client.py,sha256=c0IyAj5wxiHZgJLbFXvZm6ym5DIg1UXgPIsM2xuR3Mo,31798
7
- clickhouse_driver/bufferedreader.cpython-310-darwin.so,sha256=2C1gpAQUTaJtB7ssuNo_XHOUDICFyce467diYM6ylPk,150449
8
- clickhouse_driver/__init__.py,sha256=QRMXgeBnkcW_DpTqqIh29_xG072_EPoTyLy-1ik1MP0,158
6
+ clickhouse_driver/client.py,sha256=Zk_gnfqOSz1_3uaTsBLtOHNGX0rsiklJUPpk-1aqnXQ,34707
7
+ clickhouse_driver/bufferedreader.cpython-310-darwin.so,sha256=CpQImSiacw2en4bR6KxJpZXGto7jl3eyUlRHztF_NAI,150529
8
+ clickhouse_driver/__init__.py,sha256=Zc8GO1dmRR77BGXAzQx9tuX5pBumMtqQzQ4SH3xmBfU,158
9
9
  clickhouse_driver/opentelemetry.py,sha256=GIzHCxdB8LB1ozXtUjIpxsdznmRABAts64G2u2l4C_A,1622
10
10
  clickhouse_driver/clientinfo.py,sha256=Tw3NbuDHglT6_f0AcT0IdhqW_hVePtzh9pypx5nk5ZE,4260
11
11
  clickhouse_driver/reader.py,sha256=PWKOKwjszu0sJbG-dd_TyGn8tQAzxg2gCJVbz27G3-8,1322
12
12
  clickhouse_driver/result.py,sha256=RpjBUvRQJ70xISye7u6gxgQBJwc2UkNuusLkaZF7SmM,4098
13
- clickhouse_driver/bufferedwriter.cpython-310-darwin.so,sha256=knno11b8yZTvKyZCtzL5oRDvB-hSD3GpTh-kSlRMZhU,149393
14
- clickhouse_driver/connection.py,sha256=DTw_NofAVNS5spk5E0G-BkX-0H4gp3LZEJ59nmW8WZc,27679
13
+ clickhouse_driver/bufferedwriter.cpython-310-darwin.so,sha256=4KleUS_wr5VxEtSRXuYk0yfUOzrh9hW9ZHeOZ7ieSKQ,149761
14
+ clickhouse_driver/connection.py,sha256=Lzx6bjPDEZleEtFaede4_BcRmALIbJyQLymSmj7zAHY,28399
15
15
  clickhouse_driver/context.py,sha256=yPkJ_BN4LGODvKCOjNlDGqABwxAMQTQl7w1vIGRPBDg,909
16
- clickhouse_driver/defines.py,sha256=jM3nFdT4EPUIIj1add1BOu7T9DJv_-UOzfdbX6k3uEk,1704
16
+ clickhouse_driver/defines.py,sha256=hXIR10BvH_sxUN35pk-f-VeIbM7CA0Ll2B2yNuAy10A,1958
17
17
  clickhouse_driver/writer.py,sha256=yf5f1vTr56YFtL-Swpi_jBsPw5bQS56j53joB0Acdyk,1286
18
18
  clickhouse_driver/errors.py,sha256=mffBg-Y2LFOSRzvE9V34RwFcvmfh67yqLeEBhrdjeXE,14343
19
- clickhouse_driver/progress.py,sha256=aQUPzOg0S1kRthV1aYo-KsTmlcdM0uXVZDLDtoyKSUY,1045
19
+ clickhouse_driver/progress.py,sha256=MagDPiLzWG-2Arecu5O6JlK98242ayt9yPa9H7v9o5k,1288
20
20
  clickhouse_driver/block.py,sha256=t2zZhtCzwp4aJj0CuDqXlDEgHXgwc6GRsIks2aaIZvI,6311
21
21
  clickhouse_driver/readhelpers.py,sha256=tXOmSL9GSeHLdKE2yBlk0epfy-hGJ3bTOLq3Q6sXIkw,717
22
22
  clickhouse_driver/settings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -46,10 +46,10 @@ clickhouse_driver/dbapi/errors.py,sha256=yv2SDIK-ZlWmIxBoF5_igfHRyh9zTUJSgAj9g8S
46
46
  clickhouse_driver/dbapi/cursor.py,sha256=MOtVhXVkDYxXTAM_AeesKxrcsR64Rt2tRYVmsWLM_tQ,10517
47
47
  clickhouse_driver/columns/service.py,sha256=6nIGwvcG-5LErQFn_3a2GRKZI2OnKYsy2oIIMhxJqlc,6181
48
48
  clickhouse_driver/columns/floatcolumn.py,sha256=Mci7Fl05dgkpDQRfjGaDP9QraZER5nkYX1lVsTA89Yk,925
49
- clickhouse_driver/columns/largeint.cpython-310-darwin.so,sha256=RgjhqC3O5gj2RjSETC71HCdDLxDrf6FODTmH_Hq0QQs,100443
50
- clickhouse_driver/columns/uuidcolumn.py,sha256=d-dR_CIgtQd-CzCO90HJoeR86j7ejVchOnAKu73rVoQ,1823
49
+ clickhouse_driver/columns/largeint.cpython-310-darwin.so,sha256=ASXHYAGtXc_oUJ6KkLpMFk3PTCWdtcvN3fFdT4HtCaU,100491
50
+ clickhouse_driver/columns/uuidcolumn.py,sha256=7CLPxsHJtV6Zt9jxILSkE0LAwffloLmrjjbwCZH34mA,1865
51
51
  clickhouse_driver/columns/arraycolumn.py,sha256=UiA48jw3o4-ert8BnzEbl2h1jVmtDH3jtcP1BTPru2w,5322
52
- clickhouse_driver/columns/datecolumn.py,sha256=Xg6qHb7Lj5twtMa0jL74qoffgYMt2gK_AY9mycRxBqQ,1931
52
+ clickhouse_driver/columns/datecolumn.py,sha256=FzgS5ayxW6zfyM5qD1NXXiR4PTKz0tXEC48TwtQvbyI,1929
53
53
  clickhouse_driver/columns/nestedcolumn.py,sha256=7x3xNYR22kEmgV4_3rPVZea2zCTU364O1tlOewMgw3M,303
54
54
  clickhouse_driver/columns/util.py,sha256=5DRGBsWSTldqZRZJ53J85zh_jepkwkAsYXhAeDJQW4I,1395
55
55
  clickhouse_driver/columns/enumcolumn.py,sha256=GCSW-fjtJC4_5YKo9oKtG8GT9UhLcRWCjrBVhEAUp-A,3219
@@ -82,8 +82,8 @@ clickhouse_driver/columns/numpy/boolcolumn.py,sha256=0_RwEroY2-ZqMuxKeTNG27ZCWN_
82
82
  clickhouse_driver/columns/numpy/stringcolumn.py,sha256=FH87XPQv3ga0ZJnngubqu4DgxmUt8bjW8xJcNfOU7EI,2439
83
83
  clickhouse_driver/columns/numpy/datetimecolumn.py,sha256=XQ3JsxVdAvWJndNek4-i07JO2QJIdUnJQWzOxvF3PMc,4777
84
84
  clickhouse_driver/columns/numpy/base.py,sha256=Wk1ADpoQGWQv5X8sWi0esA2jmQGEoDakXZxImuYM2eM,1410
85
- clickhouse_driver-0.2.6.dist-info/RECORD,,
86
- clickhouse_driver-0.2.6.dist-info/LICENSE,sha256=b2SjNa4zGQk6XzJwmeE1dQjjtWRvX_zxJIAl_ZbN_S8,1143
87
- clickhouse_driver-0.2.6.dist-info/WHEEL,sha256=ReeDLt7JoWNv8uQs9jcofmiBOX-MvocIgD8kJPMfr7M,110
88
- clickhouse_driver-0.2.6.dist-info/top_level.txt,sha256=PrE0Lrs4d-gRQwzABaABfym9Qvr4nN6uTrDy6Q7zQME,18
89
- clickhouse_driver-0.2.6.dist-info/METADATA,sha256=ZkVosSXAz8QJEahMUNdyzEkuP56KeNVnleLRyPwBA_Y,6089
85
+ clickhouse_driver-0.2.7.dist-info/RECORD,,
86
+ clickhouse_driver-0.2.7.dist-info/LICENSE,sha256=b2SjNa4zGQk6XzJwmeE1dQjjtWRvX_zxJIAl_ZbN_S8,1143
87
+ clickhouse_driver-0.2.7.dist-info/WHEEL,sha256=ReeDLt7JoWNv8uQs9jcofmiBOX-MvocIgD8kJPMfr7M,110
88
+ clickhouse_driver-0.2.7.dist-info/top_level.txt,sha256=PrE0Lrs4d-gRQwzABaABfym9Qvr4nN6uTrDy6Q7zQME,18
89
+ clickhouse_driver-0.2.7.dist-info/METADATA,sha256=aQbor1BmjoDfoRvIPRh1m4XHe2Go7rRm2L-zCGde_lM,6089