clickhouse-driver 0.2.1__cp39-cp39-win_amd64.whl → 0.2.10__cp39-cp39-win_amd64.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 (85) hide show
  1. clickhouse_driver/__init__.py +9 -9
  2. clickhouse_driver/block.py +227 -195
  3. clickhouse_driver/blockstreamprofileinfo.py +22 -22
  4. clickhouse_driver/bufferedreader.cp39-win_amd64.pyd +0 -0
  5. clickhouse_driver/bufferedwriter.cp39-win_amd64.pyd +0 -0
  6. clickhouse_driver/client.py +812 -666
  7. clickhouse_driver/clientinfo.py +119 -80
  8. clickhouse_driver/columns/arraycolumn.py +161 -150
  9. clickhouse_driver/columns/base.py +221 -147
  10. clickhouse_driver/columns/boolcolumn.py +7 -0
  11. clickhouse_driver/columns/datecolumn.py +108 -49
  12. clickhouse_driver/columns/datetimecolumn.py +203 -207
  13. clickhouse_driver/columns/decimalcolumn.py +116 -118
  14. clickhouse_driver/columns/enumcolumn.py +129 -119
  15. clickhouse_driver/columns/exceptions.py +12 -12
  16. clickhouse_driver/columns/floatcolumn.py +34 -34
  17. clickhouse_driver/columns/intcolumn.py +157 -157
  18. clickhouse_driver/columns/intervalcolumn.py +33 -33
  19. clickhouse_driver/columns/ipcolumn.py +118 -118
  20. clickhouse_driver/columns/jsoncolumn.py +37 -0
  21. clickhouse_driver/columns/largeint.cp39-win_amd64.pyd +0 -0
  22. clickhouse_driver/columns/lowcardinalitycolumn.py +142 -123
  23. clickhouse_driver/columns/mapcolumn.py +73 -58
  24. clickhouse_driver/columns/nestedcolumn.py +10 -0
  25. clickhouse_driver/columns/nothingcolumn.py +13 -13
  26. clickhouse_driver/columns/nullablecolumn.py +7 -7
  27. clickhouse_driver/columns/nullcolumn.py +15 -15
  28. clickhouse_driver/columns/numpy/base.py +47 -14
  29. clickhouse_driver/columns/numpy/boolcolumn.py +8 -0
  30. clickhouse_driver/columns/numpy/datecolumn.py +19 -12
  31. clickhouse_driver/columns/numpy/datetimecolumn.py +146 -145
  32. clickhouse_driver/columns/numpy/floatcolumn.py +24 -13
  33. clickhouse_driver/columns/numpy/intcolumn.py +43 -43
  34. clickhouse_driver/columns/numpy/lowcardinalitycolumn.py +96 -83
  35. clickhouse_driver/columns/numpy/service.py +58 -80
  36. clickhouse_driver/columns/numpy/stringcolumn.py +78 -76
  37. clickhouse_driver/columns/numpy/tuplecolumn.py +37 -0
  38. clickhouse_driver/columns/service.py +185 -131
  39. clickhouse_driver/columns/simpleaggregatefunctioncolumn.py +7 -7
  40. clickhouse_driver/columns/stringcolumn.py +73 -73
  41. clickhouse_driver/columns/tuplecolumn.py +63 -65
  42. clickhouse_driver/columns/util.py +61 -0
  43. clickhouse_driver/columns/uuidcolumn.py +64 -64
  44. clickhouse_driver/compression/__init__.py +32 -28
  45. clickhouse_driver/compression/base.py +87 -52
  46. clickhouse_driver/compression/lz4.py +21 -55
  47. clickhouse_driver/compression/lz4hc.py +9 -9
  48. clickhouse_driver/compression/zstd.py +20 -51
  49. clickhouse_driver/connection.py +825 -632
  50. clickhouse_driver/context.py +36 -36
  51. clickhouse_driver/dbapi/__init__.py +62 -62
  52. clickhouse_driver/dbapi/connection.py +99 -96
  53. clickhouse_driver/dbapi/cursor.py +370 -368
  54. clickhouse_driver/dbapi/errors.py +40 -40
  55. clickhouse_driver/dbapi/extras.py +73 -0
  56. clickhouse_driver/defines.py +58 -42
  57. clickhouse_driver/errors.py +453 -446
  58. clickhouse_driver/log.py +48 -44
  59. clickhouse_driver/numpy/block.py +8 -8
  60. clickhouse_driver/numpy/helpers.py +28 -25
  61. clickhouse_driver/numpy/result.py +123 -123
  62. clickhouse_driver/opentelemetry.py +43 -0
  63. clickhouse_driver/progress.py +44 -32
  64. clickhouse_driver/protocol.py +130 -105
  65. clickhouse_driver/queryprocessingstage.py +8 -8
  66. clickhouse_driver/reader.py +69 -69
  67. clickhouse_driver/readhelpers.py +26 -26
  68. clickhouse_driver/result.py +144 -144
  69. clickhouse_driver/settings/available.py +405 -405
  70. clickhouse_driver/settings/types.py +50 -50
  71. clickhouse_driver/settings/writer.py +34 -29
  72. clickhouse_driver/streams/compressed.py +88 -88
  73. clickhouse_driver/streams/native.py +108 -90
  74. clickhouse_driver/util/compat.py +39 -0
  75. clickhouse_driver/util/escape.py +94 -55
  76. clickhouse_driver/util/helpers.py +173 -57
  77. clickhouse_driver/varint.cp39-win_amd64.pyd +0 -0
  78. clickhouse_driver/writer.py +67 -67
  79. clickhouse_driver-0.2.10.dist-info/METADATA +215 -0
  80. clickhouse_driver-0.2.10.dist-info/RECORD +89 -0
  81. {clickhouse_driver-0.2.1.dist-info → clickhouse_driver-0.2.10.dist-info}/WHEEL +1 -1
  82. {clickhouse_driver-0.2.1.dist-info → clickhouse_driver-0.2.10.dist-info/licenses}/LICENSE +21 -21
  83. clickhouse_driver-0.2.1.dist-info/METADATA +0 -24
  84. clickhouse_driver-0.2.1.dist-info/RECORD +0 -80
  85. {clickhouse_driver-0.2.1.dist-info → clickhouse_driver-0.2.10.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,61 @@
1
+
2
+ def get_inner_spec(column_name, spec):
3
+ brackets = 0
4
+ offset = len(column_name)
5
+ i = offset
6
+ for i, ch in enumerate(spec[offset:], offset):
7
+ if ch == '(':
8
+ brackets += 1
9
+
10
+ elif ch == ')':
11
+ brackets -= 1
12
+
13
+ if brackets == 0:
14
+ break
15
+
16
+ return spec[offset + 1:i]
17
+
18
+
19
+ def get_inner_columns(spec):
20
+ brackets = 0
21
+ column_begin = 0
22
+
23
+ columns = []
24
+ for i, x in enumerate(spec + ','):
25
+ if x == ',':
26
+ if brackets == 0:
27
+ columns.append(spec[column_begin:i])
28
+ column_begin = i + 1
29
+ elif x == '(':
30
+ brackets += 1
31
+ elif x == ')':
32
+ brackets -= 1
33
+ elif x == ' ':
34
+ if brackets == 0:
35
+ column_begin = i + 1
36
+ return columns
37
+
38
+
39
+ def get_inner_columns_with_types(spec):
40
+ spec = spec.strip()
41
+ brackets = 0
42
+ prev_comma = 0
43
+ prev_space = 0
44
+
45
+ columns = []
46
+ for i, x in enumerate(spec.strip() + ','):
47
+ if x == ',':
48
+ if brackets == 0:
49
+ columns.append((
50
+ spec[prev_comma:prev_space].strip(),
51
+ spec[prev_space:i]
52
+ ))
53
+ prev_comma = i + 1
54
+ elif x == '(':
55
+ brackets += 1
56
+ elif x == ')':
57
+ brackets -= 1
58
+ elif x == ' ':
59
+ if brackets == 0:
60
+ prev_space = i + 1
61
+ return columns
@@ -1,64 +1,64 @@
1
- from uuid import UUID
2
-
3
- from .base import FormatColumn
4
- from .. import errors
5
- from ..writer import MAX_UINT64
6
-
7
-
8
- class UUIDColumn(FormatColumn):
9
- ch_type = 'UUID'
10
- py_types = (str, UUID)
11
- format = 'Q'
12
-
13
- # UUID is stored by two uint64 numbers.
14
- def write_items(self, items, buf):
15
- n_items = len(items)
16
-
17
- uint_64_pairs = [None] * 2 * n_items
18
- for i, x in enumerate(items):
19
- i2 = 2 * i
20
- uint_64_pairs[i2] = (x >> 64) & MAX_UINT64
21
- uint_64_pairs[i2 + 1] = x & MAX_UINT64
22
-
23
- s = self.make_struct(2 * n_items)
24
- buf.write(s.pack(*uint_64_pairs))
25
-
26
- def read_items(self, n_items, buf):
27
- # TODO: cythonize
28
- s = self.make_struct(2 * n_items)
29
- items = s.unpack(buf.read(s.size))
30
-
31
- uint_128_items = [None] * n_items
32
- for i in range(n_items):
33
- i2 = 2 * i
34
- uint_128_items[i] = (items[i2] << 64) + items[i2 + 1]
35
-
36
- return tuple(uint_128_items)
37
-
38
- def after_read_items(self, items, nulls_map=None):
39
- if nulls_map is None:
40
- return tuple(UUID(int=item) for item in items)
41
- else:
42
- return tuple(
43
- (None if is_null else UUID(int=items[i]))
44
- for i, is_null in enumerate(nulls_map)
45
- )
46
-
47
- def before_write_items(self, items, nulls_map=None):
48
- null_value = self.null_value
49
-
50
- for i, item in enumerate(items):
51
- if nulls_map and nulls_map[i]:
52
- items[i] = null_value
53
- continue
54
-
55
- try:
56
- if not isinstance(item, UUID):
57
- item = UUID(item)
58
-
59
- except ValueError:
60
- raise errors.CannotParseUuidError(
61
- "Cannot parse uuid '{}'".format(item)
62
- )
63
-
64
- items[i] = item.int
1
+ from uuid import UUID
2
+
3
+ from .base import FormatColumn
4
+ from .. import errors
5
+ from ..writer import MAX_UINT64
6
+
7
+
8
+ class UUIDColumn(FormatColumn):
9
+ ch_type = 'UUID'
10
+ py_types = (str, UUID)
11
+ format = 'Q'
12
+
13
+ # UUID is stored by two uint64 numbers.
14
+ def write_items(self, items, buf):
15
+ n_items = len(items)
16
+
17
+ uint_64_pairs = [None] * 2 * n_items
18
+ for i, x in enumerate(items):
19
+ i2 = 2 * i
20
+ uint_64_pairs[i2] = (x >> 64) & MAX_UINT64
21
+ uint_64_pairs[i2 + 1] = x & MAX_UINT64
22
+
23
+ s = self.make_struct(2 * n_items)
24
+ buf.write(s.pack(*uint_64_pairs))
25
+
26
+ def read_items(self, n_items, buf):
27
+ # TODO: cythonize
28
+ s = self.make_struct(2 * n_items)
29
+ items = s.unpack(buf.read(s.size))
30
+
31
+ uint_128_items = [None] * n_items
32
+ for i in range(n_items):
33
+ i2 = 2 * i
34
+ uint_128_items[i] = (items[i2] << 64) + items[i2 + 1]
35
+
36
+ return tuple(uint_128_items)
37
+
38
+ def after_read_items(self, items, nulls_map=None):
39
+ if nulls_map is None:
40
+ return tuple(UUID(int=item) for item in items)
41
+ else:
42
+ return tuple(
43
+ (None if is_null else UUID(int=items[i]))
44
+ for i, is_null in enumerate(nulls_map)
45
+ )
46
+
47
+ def before_write_items(self, items, nulls_map=None):
48
+ null_value = self.null_value
49
+
50
+ for i, item in enumerate(items):
51
+ if nulls_map and nulls_map[i]:
52
+ items[i] = null_value
53
+ continue
54
+
55
+ try:
56
+ if not isinstance(item, UUID):
57
+ item = UUID(int=item) if item is null_value else UUID(item)
58
+
59
+ except ValueError:
60
+ raise errors.CannotParseUuidError(
61
+ "Cannot parse uuid '{}'".format(item)
62
+ )
63
+
64
+ items[i] = item.int
@@ -1,28 +1,32 @@
1
- import importlib
2
-
3
- from .. import errors
4
- from ..protocol import CompressionMethodByte
5
-
6
-
7
- def get_compressor_cls(alg):
8
- try:
9
- module = importlib.import_module('.' + alg, __name__)
10
- return module.Compressor
11
-
12
- except ImportError:
13
- raise errors.UnknownCompressionMethod(
14
- "Unknown compression method: '{}'".format(alg)
15
- )
16
-
17
-
18
- def get_decompressor_cls(method_type):
19
- if method_type == CompressionMethodByte.LZ4:
20
- module = importlib.import_module('.lz4', __name__)
21
-
22
- elif method_type == CompressionMethodByte.ZSTD:
23
- module = importlib.import_module('.zstd', __name__)
24
-
25
- else:
26
- raise errors.UnknownCompressionMethod()
27
-
28
- return module.Decompressor
1
+ import importlib
2
+ import logging
3
+
4
+ from .. import errors
5
+ from ..protocol import CompressionMethodByte
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+
10
+ def get_compressor_cls(alg):
11
+ try:
12
+ module = importlib.import_module('.' + alg, __name__)
13
+ return module.Compressor
14
+
15
+ except ImportError:
16
+ logger.warning('Unable to import module %s', alg, exc_info=True)
17
+ raise errors.UnknownCompressionMethod(
18
+ "Unknown compression method: '{}'".format(alg)
19
+ )
20
+
21
+
22
+ def get_decompressor_cls(method_type):
23
+ if method_type == CompressionMethodByte.LZ4:
24
+ module = importlib.import_module('.lz4', __name__)
25
+
26
+ elif method_type == CompressionMethodByte.ZSTD:
27
+ module = importlib.import_module('.zstd', __name__)
28
+
29
+ else:
30
+ raise errors.UnknownCompressionMethod()
31
+
32
+ return module.Decompressor
@@ -1,52 +1,87 @@
1
- from io import BytesIO
2
-
3
- try:
4
- from clickhouse_cityhash.cityhash import CityHash128
5
- except ImportError:
6
- raise RuntimeError(
7
- 'Package clickhouse-cityhash is required to use compression'
8
- )
9
-
10
- from .. import errors
11
-
12
-
13
- class BaseCompressor(object):
14
- """
15
- Partial file-like object with write method.
16
- """
17
- method = None
18
- method_byte = None
19
-
20
- def __init__(self):
21
- self.data = BytesIO()
22
-
23
- super(BaseCompressor, self).__init__()
24
-
25
- def get_value(self):
26
- value = self.data.getvalue()
27
- self.data.seek(0)
28
- self.data.truncate()
29
- return value
30
-
31
- def write(self, p_str):
32
- self.data.write(p_str)
33
-
34
- def get_compressed_data(self, extra_header_size):
35
- raise NotImplementedError
36
-
37
-
38
- class BaseDecompressor(object):
39
- method = None
40
- method_byte = None
41
-
42
- def __init__(self, real_stream):
43
- self.stream = real_stream
44
- super(BaseDecompressor, self).__init__()
45
-
46
- def check_hash(self, compressed_data, compressed_hash):
47
- if CityHash128(compressed_data) != compressed_hash:
48
- raise errors.ChecksumDoesntMatchError()
49
-
50
- def get_decompressed_data(self, method_byte, compressed_hash,
51
- extra_header_size):
52
- raise NotImplementedError
1
+ from io import BytesIO
2
+
3
+ from ..reader import read_binary_uint32
4
+ from ..writer import write_binary_uint8, write_binary_uint32
5
+ from .. import errors
6
+
7
+ try:
8
+ from clickhouse_cityhash.cityhash import CityHash128
9
+ except ImportError:
10
+ raise RuntimeError(
11
+ 'Package clickhouse-cityhash is required to use compression'
12
+ )
13
+
14
+
15
+ class BaseCompressor(object):
16
+ """
17
+ Partial file-like object with write method.
18
+ """
19
+ method = None
20
+ method_byte = None
21
+
22
+ def __init__(self):
23
+ self.data = BytesIO()
24
+
25
+ super(BaseCompressor, self).__init__()
26
+
27
+ def get_value(self):
28
+ value = self.data.getvalue()
29
+ self.data.seek(0)
30
+ self.data.truncate()
31
+ return value
32
+
33
+ def write(self, p_str):
34
+ self.data.write(p_str)
35
+
36
+ def compress_data(self, data):
37
+ raise NotImplementedError
38
+
39
+ def get_compressed_data(self, extra_header_size):
40
+ rv = BytesIO()
41
+
42
+ data = self.get_value()
43
+ compressed = self.compress_data(data)
44
+
45
+ header_size = extra_header_size + 4 + 4 # sizes
46
+
47
+ write_binary_uint32(header_size + len(compressed), rv)
48
+ write_binary_uint32(len(data), rv)
49
+ rv.write(compressed)
50
+
51
+ return rv.getvalue()
52
+
53
+
54
+ class BaseDecompressor(object):
55
+ method = None
56
+ method_byte = None
57
+
58
+ def __init__(self, real_stream):
59
+ self.stream = real_stream
60
+ super(BaseDecompressor, self).__init__()
61
+
62
+ def decompress_data(self, data, uncompressed_size):
63
+ raise NotImplementedError
64
+
65
+ def check_hash(self, compressed_data, compressed_hash):
66
+ if CityHash128(compressed_data) != compressed_hash:
67
+ raise errors.ChecksumDoesntMatchError()
68
+
69
+ def get_decompressed_data(self, method_byte, compressed_hash,
70
+ extra_header_size):
71
+ size_with_header = read_binary_uint32(self.stream)
72
+ compressed_size = size_with_header - extra_header_size - 4
73
+
74
+ compressed = BytesIO(self.stream.read(compressed_size))
75
+
76
+ block_check = BytesIO()
77
+ write_binary_uint8(method_byte, block_check)
78
+ write_binary_uint32(size_with_header, block_check)
79
+ block_check.write(compressed.getvalue())
80
+
81
+ self.check_hash(block_check.getvalue(), compressed_hash)
82
+
83
+ uncompressed_size = read_binary_uint32(compressed)
84
+
85
+ compressed = compressed.read(compressed_size - 4)
86
+
87
+ return self.decompress_data(compressed, uncompressed_size)
@@ -1,55 +1,21 @@
1
- from __future__ import absolute_import
2
- from io import BytesIO
3
-
4
- from lz4 import block
5
-
6
- from .base import BaseCompressor, BaseDecompressor
7
- from ..protocol import CompressionMethod, CompressionMethodByte
8
- from ..reader import read_binary_uint32
9
- from ..writer import write_binary_uint32, write_binary_uint8
10
-
11
-
12
- class Compressor(BaseCompressor):
13
- method = CompressionMethod.LZ4
14
- method_byte = CompressionMethodByte.LZ4
15
- mode = 'default'
16
-
17
- def get_compressed_data(self, extra_header_size):
18
- rv = BytesIO()
19
-
20
- data = self.get_value()
21
- compressed = block.compress(data, store_size=False, mode=self.mode)
22
-
23
- header_size = extra_header_size + 4 + 4 # sizes
24
-
25
- write_binary_uint32(header_size + len(compressed), rv)
26
- write_binary_uint32(len(data), rv)
27
- rv.write(compressed)
28
-
29
- return rv.getvalue()
30
-
31
-
32
- class Decompressor(BaseDecompressor):
33
- method = CompressionMethod.LZ4
34
- method_byte = CompressionMethodByte.LZ4
35
-
36
- def get_decompressed_data(self, method_byte, compressed_hash,
37
- extra_header_size):
38
- size_with_header = read_binary_uint32(self.stream)
39
- compressed_size = size_with_header - extra_header_size - 4
40
-
41
- compressed = BytesIO(self.stream.read(compressed_size))
42
-
43
- block_check = BytesIO()
44
- write_binary_uint8(method_byte, block_check)
45
- write_binary_uint32(size_with_header, block_check)
46
- block_check.write(compressed.getvalue())
47
-
48
- self.check_hash(block_check.getvalue(), compressed_hash)
49
-
50
- uncompressed_size = read_binary_uint32(compressed)
51
-
52
- compressed = compressed.read(compressed_size - 4)
53
-
54
- return block.decompress(compressed,
55
- uncompressed_size=uncompressed_size)
1
+ from lz4 import block
2
+
3
+ from .base import BaseCompressor, BaseDecompressor
4
+ from ..protocol import CompressionMethod, CompressionMethodByte
5
+
6
+
7
+ class Compressor(BaseCompressor):
8
+ method = CompressionMethod.LZ4
9
+ method_byte = CompressionMethodByte.LZ4
10
+ mode = 'default'
11
+
12
+ def compress_data(self, data):
13
+ return block.compress(data, store_size=False, mode=self.mode)
14
+
15
+
16
+ class Decompressor(BaseDecompressor):
17
+ method = CompressionMethod.LZ4
18
+ method_byte = CompressionMethodByte.LZ4
19
+
20
+ def decompress_data(self, data, uncompressed_size):
21
+ return block.decompress(data, uncompressed_size=uncompressed_size)
@@ -1,9 +1,9 @@
1
- from .lz4 import Compressor as BaseCompressor, Decompressor as BaseDecompressor
2
-
3
-
4
- class Compressor(BaseCompressor):
5
- mode = 'high_compression'
6
-
7
-
8
- class Decompressor(BaseDecompressor):
9
- pass
1
+ from .lz4 import Compressor as BaseCompressor, Decompressor as BaseDecompressor
2
+
3
+
4
+ class Compressor(BaseCompressor):
5
+ mode = 'high_compression'
6
+
7
+
8
+ class Decompressor(BaseDecompressor):
9
+ pass
@@ -1,51 +1,20 @@
1
- from __future__ import absolute_import
2
- from io import BytesIO
3
-
4
- import zstd
5
-
6
- from .base import BaseCompressor, BaseDecompressor
7
- from ..protocol import CompressionMethod, CompressionMethodByte
8
- from ..reader import read_binary_uint32
9
- from ..writer import write_binary_uint32, write_binary_uint8
10
-
11
-
12
- class Compressor(BaseCompressor):
13
- method = CompressionMethod.ZSTD
14
- method_byte = CompressionMethodByte.ZSTD
15
-
16
- def get_compressed_data(self, extra_header_size):
17
- rv = BytesIO()
18
-
19
- data = self.get_value()
20
- compressed = zstd.compress(data)
21
-
22
- header_size = extra_header_size + 4 + 4 # sizes
23
-
24
- write_binary_uint32(header_size + len(compressed), rv)
25
- write_binary_uint32(len(data), rv)
26
- rv.write(compressed)
27
-
28
- return rv.getvalue()
29
-
30
-
31
- class Decompressor(BaseDecompressor):
32
- method = CompressionMethod.ZSTD
33
- method_byte = CompressionMethodByte.ZSTD
34
-
35
- def get_decompressed_data(self, method_byte, compressed_hash,
36
- extra_header_size):
37
- size_with_header = read_binary_uint32(self.stream)
38
- compressed_size = size_with_header - extra_header_size - 4
39
-
40
- compressed = BytesIO(self.stream.read(compressed_size))
41
-
42
- block_check = BytesIO()
43
- write_binary_uint8(method_byte, block_check)
44
- write_binary_uint32(size_with_header, block_check)
45
- block_check.write(compressed.getvalue())
46
-
47
- self.check_hash(block_check.getvalue(), compressed_hash)
48
-
49
- compressed = compressed.read(compressed_size - 4)
50
-
51
- return zstd.decompress(compressed)
1
+ import zstd
2
+
3
+ from .base import BaseCompressor, BaseDecompressor
4
+ from ..protocol import CompressionMethod, CompressionMethodByte
5
+
6
+
7
+ class Compressor(BaseCompressor):
8
+ method = CompressionMethod.ZSTD
9
+ method_byte = CompressionMethodByte.ZSTD
10
+
11
+ def compress_data(self, data):
12
+ return zstd.compress(data)
13
+
14
+
15
+ class Decompressor(BaseDecompressor):
16
+ method = CompressionMethod.ZSTD
17
+ method_byte = CompressionMethodByte.ZSTD
18
+
19
+ def decompress_data(self, data, uncompressed_size):
20
+ return zstd.decompress(data)