clickhouse-driver 0.2.1__cp39-cp39-win_amd64.whl → 0.2.8__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 +896 -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 +202 -207
  13. clickhouse_driver/columns/decimalcolumn.py +116 -118
  14. clickhouse_driver/columns/enumcolumn.py +119 -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 +143 -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 +60 -0
  43. clickhouse_driver/columns/uuidcolumn.py +64 -64
  44. clickhouse_driver/compression/__init__.py +28 -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 +784 -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 +55 -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 +25 -25
  61. clickhouse_driver/numpy/result.py +123 -123
  62. clickhouse_driver/opentelemetry.py +43 -0
  63. clickhouse_driver/progress.py +38 -32
  64. clickhouse_driver/protocol.py +114 -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 +102 -90
  74. clickhouse_driver/util/compat.py +39 -0
  75. clickhouse_driver/util/escape.py +94 -55
  76. clickhouse_driver/util/helpers.py +57 -57
  77. clickhouse_driver/varint.cp39-win_amd64.pyd +0 -0
  78. clickhouse_driver/writer.py +67 -67
  79. {clickhouse_driver-0.2.1.dist-info → clickhouse_driver-0.2.8.dist-info}/LICENSE +21 -21
  80. clickhouse_driver-0.2.8.dist-info/METADATA +201 -0
  81. clickhouse_driver-0.2.8.dist-info/RECORD +89 -0
  82. {clickhouse_driver-0.2.1.dist-info → clickhouse_driver-0.2.8.dist-info}/WHEEL +1 -1
  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.8.dist-info}/top_level.txt +0 -0
@@ -1,119 +1,119 @@
1
- from enum import Enum
2
-
3
- from .. import errors
4
- from .intcolumn import IntColumn
5
-
6
-
7
- class EnumColumn(IntColumn):
8
- py_types = (Enum, int, str)
9
-
10
- def __init__(self, enum_cls, **kwargs):
11
- self.enum_cls = enum_cls
12
- super(EnumColumn, self).__init__(**kwargs)
13
-
14
- def before_write_items(self, items, nulls_map=None):
15
- null_value = self.null_value
16
-
17
- enum_cls = self.enum_cls
18
-
19
- for i, item in enumerate(items):
20
- if nulls_map and nulls_map[i]:
21
- items[i] = null_value
22
- continue
23
-
24
- source_value = item.name if isinstance(item, Enum) else item
25
-
26
- # Check real enum value
27
- try:
28
- if isinstance(source_value, str):
29
- items[i] = enum_cls[source_value].value
30
- else:
31
- items[i] = enum_cls(source_value).value
32
- except (ValueError, KeyError):
33
- choices = ', '.join(
34
- "'{}' = {}".format(x.name.replace("'", r"\'"), x.value)
35
- for x in enum_cls
36
- )
37
- enum_str = '{}({})'.format(enum_cls.__name__, choices)
38
-
39
- raise errors.LogicalError(
40
- "Unknown element '{}' for type {}"
41
- .format(source_value, enum_str)
42
- )
43
-
44
- def after_read_items(self, items, nulls_map=None):
45
- enum_cls = self.enum_cls
46
-
47
- if nulls_map is None:
48
- return tuple(enum_cls(item).name for item in items)
49
- else:
50
- return tuple(
51
- (None if is_null else enum_cls(items[i]).name)
52
- for i, is_null in enumerate(nulls_map)
53
- )
54
-
55
-
56
- class Enum8Column(EnumColumn):
57
- ch_type = 'Enum8'
58
- format = 'b'
59
- int_size = 1
60
-
61
-
62
- class Enum16Column(EnumColumn):
63
- ch_type = 'Enum16'
64
- format = 'h'
65
- int_size = 2
66
-
67
-
68
- def create_enum_column(spec, column_options):
69
- if spec.startswith('Enum8'):
70
- params = spec[6:-1]
71
- cls = Enum8Column
72
- else:
73
- params = spec[7:-1]
74
- cls = Enum16Column
75
-
76
- return cls(Enum(cls.ch_type, _parse_options(params)), **column_options)
77
-
78
-
79
- def _parse_options(option_string):
80
- options = dict()
81
- after_name = False
82
- escaped = False
83
- quote_character = None
84
- name = ''
85
- value = ''
86
-
87
- for ch in option_string:
88
- if escaped:
89
- name += ch
90
- escaped = False # accepting escaped character
91
-
92
- elif after_name:
93
- if ch in (' ', '='):
94
- pass
95
- elif ch == ',':
96
- options[name] = int(value)
97
- after_name = False
98
- name = ''
99
- value = '' # reset before collecting new option
100
- else:
101
- value += ch
102
-
103
- elif quote_character:
104
- if ch == '\\':
105
- escaped = True
106
- elif ch == quote_character:
107
- quote_character = None
108
- after_name = True # start collecting option value
109
- else:
110
- name += ch
111
-
112
- else:
113
- if ch == "'":
114
- quote_character = ch
115
-
116
- if after_name:
117
- options.setdefault(name, int(value)) # append word after last comma
118
-
119
- return options
1
+ from enum import Enum
2
+
3
+ from .. import errors
4
+ from .intcolumn import IntColumn
5
+
6
+
7
+ class EnumColumn(IntColumn):
8
+ py_types = (Enum, int, str)
9
+
10
+ def __init__(self, enum_cls, **kwargs):
11
+ self.enum_cls = enum_cls
12
+ super(EnumColumn, self).__init__(**kwargs)
13
+
14
+ def before_write_items(self, items, nulls_map=None):
15
+ null_value = self.null_value
16
+
17
+ enum_cls = self.enum_cls
18
+
19
+ for i, item in enumerate(items):
20
+ if nulls_map and nulls_map[i]:
21
+ items[i] = null_value
22
+ continue
23
+
24
+ source_value = item.name if isinstance(item, Enum) else item
25
+
26
+ # Check real enum value
27
+ try:
28
+ if isinstance(source_value, str):
29
+ items[i] = enum_cls[source_value].value
30
+ else:
31
+ items[i] = enum_cls(source_value).value
32
+ except (ValueError, KeyError):
33
+ choices = ', '.join(
34
+ "'{}' = {}".format(x.name.replace("'", r"\'"), x.value)
35
+ for x in enum_cls
36
+ )
37
+ enum_str = '{}({})'.format(enum_cls.__name__, choices)
38
+
39
+ raise errors.LogicalError(
40
+ "Unknown element '{}' for type {}"
41
+ .format(source_value, enum_str)
42
+ )
43
+
44
+ def after_read_items(self, items, nulls_map=None):
45
+ enum_cls = self.enum_cls
46
+
47
+ if nulls_map is None:
48
+ return tuple(enum_cls(item).name for item in items)
49
+ else:
50
+ return tuple(
51
+ (None if is_null else enum_cls(items[i]).name)
52
+ for i, is_null in enumerate(nulls_map)
53
+ )
54
+
55
+
56
+ class Enum8Column(EnumColumn):
57
+ ch_type = 'Enum8'
58
+ format = 'b'
59
+ int_size = 1
60
+
61
+
62
+ class Enum16Column(EnumColumn):
63
+ ch_type = 'Enum16'
64
+ format = 'h'
65
+ int_size = 2
66
+
67
+
68
+ def create_enum_column(spec, column_options):
69
+ if spec.startswith('Enum8'):
70
+ params = spec[6:-1]
71
+ cls = Enum8Column
72
+ else:
73
+ params = spec[7:-1]
74
+ cls = Enum16Column
75
+
76
+ return cls(Enum(cls.ch_type, _parse_options(params)), **column_options)
77
+
78
+
79
+ def _parse_options(option_string):
80
+ options = dict()
81
+ after_name = False
82
+ escaped = False
83
+ quote_character = None
84
+ name = ''
85
+ value = ''
86
+
87
+ for ch in option_string:
88
+ if escaped:
89
+ name += ch
90
+ escaped = False # accepting escaped character
91
+
92
+ elif after_name:
93
+ if ch in (' ', '='):
94
+ pass
95
+ elif ch == ',':
96
+ options[name] = int(value)
97
+ after_name = False
98
+ name = ''
99
+ value = '' # reset before collecting new option
100
+ else:
101
+ value += ch
102
+
103
+ elif quote_character:
104
+ if ch == '\\':
105
+ escaped = True
106
+ elif ch == quote_character:
107
+ quote_character = None
108
+ after_name = True # start collecting option value
109
+ else:
110
+ name += ch
111
+
112
+ else:
113
+ if ch == "'":
114
+ quote_character = ch
115
+
116
+ if after_name:
117
+ options.setdefault(name, int(value)) # append word after last comma
118
+
119
+ return options
@@ -1,12 +1,12 @@
1
-
2
-
3
- class ColumnException(Exception):
4
- pass
5
-
6
-
7
- class ColumnTypeMismatchException(ColumnException):
8
- pass
9
-
10
-
11
- class StructPackException(ColumnException):
12
- pass
1
+
2
+
3
+ class ColumnException(Exception):
4
+ pass
5
+
6
+
7
+ class ColumnTypeMismatchException(ColumnException):
8
+ pass
9
+
10
+
11
+ class StructPackException(ColumnException):
12
+ pass
@@ -1,34 +1,34 @@
1
- from ctypes import c_float
2
-
3
- from .base import FormatColumn
4
-
5
-
6
- class FloatColumn(FormatColumn):
7
- py_types = (float, int)
8
-
9
-
10
- class Float32Column(FloatColumn):
11
- ch_type = 'Float32'
12
- format = 'f'
13
-
14
- def __init__(self, types_check=False, **kwargs):
15
- super(Float32Column, self).__init__(types_check=types_check, **kwargs)
16
-
17
- if types_check:
18
- # Chop only bytes that fit current type.
19
- # Cast to -nan or nan if overflows.
20
- def before_write_items(items, nulls_map=None):
21
- null_value = self.null_value
22
-
23
- for i, item in enumerate(items):
24
- if nulls_map and nulls_map[i]:
25
- items[i] = null_value
26
- else:
27
- items[i] = c_float(item).value
28
-
29
- self.before_write_items = before_write_items
30
-
31
-
32
- class Float64Column(FloatColumn):
33
- ch_type = 'Float64'
34
- format = 'd'
1
+ from ctypes import c_float
2
+
3
+ from .base import FormatColumn
4
+
5
+
6
+ class FloatColumn(FormatColumn):
7
+ py_types = (float, int)
8
+
9
+
10
+ class Float32Column(FloatColumn):
11
+ ch_type = 'Float32'
12
+ format = 'f'
13
+
14
+ def __init__(self, types_check=False, **kwargs):
15
+ super(Float32Column, self).__init__(types_check=types_check, **kwargs)
16
+
17
+ if types_check:
18
+ # Chop only bytes that fit current type.
19
+ # Cast to -nan or nan if overflows.
20
+ def before_write_items(items, nulls_map=None):
21
+ null_value = self.null_value
22
+
23
+ for i, item in enumerate(items):
24
+ if nulls_map and nulls_map[i]:
25
+ items[i] = null_value
26
+ else:
27
+ items[i] = c_float(item).value
28
+
29
+ self.before_write_items = before_write_items
30
+
31
+
32
+ class Float64Column(FloatColumn):
33
+ ch_type = 'Float64'
34
+ format = 'd'
@@ -1,157 +1,157 @@
1
-
2
- from .exceptions import ColumnTypeMismatchException
3
- from .base import FormatColumn
4
- from .largeint import (
5
- int128_from_quads, int128_to_quads, uint128_from_quads, uint128_to_quads,
6
- int256_from_quads, int256_to_quads, uint256_from_quads, uint256_to_quads
7
- )
8
-
9
-
10
- class IntColumn(FormatColumn):
11
- py_types = (int, )
12
- int_size = None
13
-
14
- def __init__(self, types_check=False, **kwargs):
15
- super(IntColumn, self).__init__(types_check=types_check, **kwargs)
16
-
17
- if types_check:
18
- self.mask = (1 << 8 * self.int_size) - 1
19
-
20
- # Chop only bytes that fit current type.
21
- # ctypes.c_intXX is slower.
22
- def before_write_items(items, nulls_map=None):
23
- # TODO: cythonize
24
- null_value = self.null_value
25
-
26
- for i, item in enumerate(items):
27
- if nulls_map and nulls_map[i]:
28
- items[i] = null_value
29
- continue
30
-
31
- if item >= 0:
32
- sign = 1
33
- else:
34
- sign = -1
35
- item = -item
36
-
37
- items[i] = sign * (item & self.mask)
38
-
39
- self.before_write_items = before_write_items
40
-
41
-
42
- class UIntColumn(IntColumn):
43
- def __init__(self, types_check=False, **kwargs):
44
- super(UIntColumn, self).__init__(types_check=types_check, **kwargs)
45
-
46
- if types_check:
47
- def check_item(value):
48
- if value < 0:
49
- raise ColumnTypeMismatchException(value)
50
-
51
- self.check_item = check_item
52
-
53
-
54
- class Int8Column(IntColumn):
55
- ch_type = 'Int8'
56
- format = 'b'
57
- int_size = 1
58
-
59
-
60
- class Int16Column(IntColumn):
61
- ch_type = 'Int16'
62
- format = 'h'
63
- int_size = 2
64
-
65
-
66
- class Int32Column(IntColumn):
67
- ch_type = 'Int32'
68
- format = 'i'
69
- int_size = 4
70
-
71
-
72
- class Int64Column(IntColumn):
73
- ch_type = 'Int64'
74
- format = 'q'
75
- int_size = 8
76
-
77
-
78
- class UInt8Column(UIntColumn):
79
- ch_type = 'UInt8'
80
- format = 'B'
81
- int_size = 1
82
-
83
-
84
- class UInt16Column(UIntColumn):
85
- ch_type = 'UInt16'
86
- format = 'H'
87
- int_size = 2
88
-
89
-
90
- class UInt32Column(UIntColumn):
91
- ch_type = 'UInt32'
92
- format = 'I'
93
- int_size = 4
94
-
95
-
96
- class UInt64Column(UIntColumn):
97
- ch_type = 'UInt64'
98
- format = 'Q'
99
- int_size = 8
100
-
101
-
102
- class LargeIntColumn(IntColumn):
103
- format = 'Q' # We manually deal with sign in read/write.
104
- factor = None
105
-
106
- to_quads = None
107
- from_quads = None
108
-
109
- def write_items(self, items, buf):
110
- n_items = len(items)
111
-
112
- s = self.make_struct(self.factor * n_items)
113
- uint_64_pairs = self.to_quads(items, n_items)
114
-
115
- buf.write(s.pack(*uint_64_pairs))
116
-
117
- def read_items(self, n_items, buf):
118
- s = self.make_struct(self.factor * n_items)
119
- items = s.unpack(buf.read(s.size))
120
-
121
- return self.from_quads(items, n_items)
122
-
123
-
124
- class Int128Column(LargeIntColumn):
125
- ch_type = 'Int128'
126
- int_size = 16
127
- factor = 2
128
-
129
- to_quads = int128_to_quads
130
- from_quads = int128_from_quads
131
-
132
-
133
- class UInt128Column(LargeIntColumn):
134
- ch_type = 'UInt128'
135
- int_size = 16
136
- factor = 2
137
-
138
- to_quads = uint128_to_quads
139
- from_quads = uint128_from_quads
140
-
141
-
142
- class Int256Column(LargeIntColumn):
143
- ch_type = 'Int256'
144
- int_size = 32
145
- factor = 4
146
-
147
- to_quads = int256_to_quads
148
- from_quads = int256_from_quads
149
-
150
-
151
- class UInt256Column(LargeIntColumn):
152
- ch_type = 'UInt256'
153
- int_size = 32
154
- factor = 4
155
-
156
- to_quads = uint256_to_quads
157
- from_quads = uint256_from_quads
1
+
2
+ from .exceptions import ColumnTypeMismatchException
3
+ from .base import FormatColumn
4
+ from .largeint import (
5
+ int128_from_quads, int128_to_quads, uint128_from_quads, uint128_to_quads,
6
+ int256_from_quads, int256_to_quads, uint256_from_quads, uint256_to_quads
7
+ )
8
+
9
+
10
+ class IntColumn(FormatColumn):
11
+ py_types = (int, )
12
+ int_size = None
13
+
14
+ def __init__(self, types_check=False, **kwargs):
15
+ super(IntColumn, self).__init__(types_check=types_check, **kwargs)
16
+
17
+ if types_check:
18
+ self.mask = (1 << 8 * self.int_size) - 1
19
+
20
+ # Chop only bytes that fit current type.
21
+ # ctypes.c_intXX is slower.
22
+ def before_write_items(items, nulls_map=None):
23
+ # TODO: cythonize
24
+ null_value = self.null_value
25
+
26
+ for i, item in enumerate(items):
27
+ if nulls_map and nulls_map[i]:
28
+ items[i] = null_value
29
+ continue
30
+
31
+ if item >= 0:
32
+ sign = 1
33
+ else:
34
+ sign = -1
35
+ item = -item
36
+
37
+ items[i] = sign * (item & self.mask)
38
+
39
+ self.before_write_items = before_write_items
40
+
41
+
42
+ class UIntColumn(IntColumn):
43
+ def __init__(self, types_check=False, **kwargs):
44
+ super(UIntColumn, self).__init__(types_check=types_check, **kwargs)
45
+
46
+ if types_check:
47
+ def check_item(value):
48
+ if value < 0:
49
+ raise ColumnTypeMismatchException(value)
50
+
51
+ self.check_item = check_item
52
+
53
+
54
+ class Int8Column(IntColumn):
55
+ ch_type = 'Int8'
56
+ format = 'b'
57
+ int_size = 1
58
+
59
+
60
+ class Int16Column(IntColumn):
61
+ ch_type = 'Int16'
62
+ format = 'h'
63
+ int_size = 2
64
+
65
+
66
+ class Int32Column(IntColumn):
67
+ ch_type = 'Int32'
68
+ format = 'i'
69
+ int_size = 4
70
+
71
+
72
+ class Int64Column(IntColumn):
73
+ ch_type = 'Int64'
74
+ format = 'q'
75
+ int_size = 8
76
+
77
+
78
+ class UInt8Column(UIntColumn):
79
+ ch_type = 'UInt8'
80
+ format = 'B'
81
+ int_size = 1
82
+
83
+
84
+ class UInt16Column(UIntColumn):
85
+ ch_type = 'UInt16'
86
+ format = 'H'
87
+ int_size = 2
88
+
89
+
90
+ class UInt32Column(UIntColumn):
91
+ ch_type = 'UInt32'
92
+ format = 'I'
93
+ int_size = 4
94
+
95
+
96
+ class UInt64Column(UIntColumn):
97
+ ch_type = 'UInt64'
98
+ format = 'Q'
99
+ int_size = 8
100
+
101
+
102
+ class LargeIntColumn(IntColumn):
103
+ format = 'Q' # We manually deal with sign in read/write.
104
+ factor = None
105
+
106
+ to_quads = None
107
+ from_quads = None
108
+
109
+ def write_items(self, items, buf):
110
+ n_items = len(items)
111
+
112
+ s = self.make_struct(self.factor * n_items)
113
+ uint_64_pairs = self.to_quads(items, n_items)
114
+
115
+ buf.write(s.pack(*uint_64_pairs))
116
+
117
+ def read_items(self, n_items, buf):
118
+ s = self.make_struct(self.factor * n_items)
119
+ items = s.unpack(buf.read(s.size))
120
+
121
+ return self.from_quads(items, n_items)
122
+
123
+
124
+ class Int128Column(LargeIntColumn):
125
+ ch_type = 'Int128'
126
+ int_size = 16
127
+ factor = 2
128
+
129
+ to_quads = int128_to_quads
130
+ from_quads = int128_from_quads
131
+
132
+
133
+ class UInt128Column(LargeIntColumn):
134
+ ch_type = 'UInt128'
135
+ int_size = 16
136
+ factor = 2
137
+
138
+ to_quads = uint128_to_quads
139
+ from_quads = uint128_from_quads
140
+
141
+
142
+ class Int256Column(LargeIntColumn):
143
+ ch_type = 'Int256'
144
+ int_size = 32
145
+ factor = 4
146
+
147
+ to_quads = int256_to_quads
148
+ from_quads = int256_from_quads
149
+
150
+
151
+ class UInt256Column(LargeIntColumn):
152
+ ch_type = 'UInt256'
153
+ int_size = 32
154
+ factor = 4
155
+
156
+ to_quads = uint256_to_quads
157
+ from_quads = uint256_from_quads