Coverage Report

Created: 2025-08-26 07:03

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/Users/andrewlamb/Software/arrow-rs/arrow-data/src/decimal.rs
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
//! Maximum and minimum values for [`Decimal256`], [`Decimal128`], [`Decimal64`] and [`Decimal32`].
19
//!
20
//! Also provides functions to validate if a given decimal value is within
21
//! the valid range of the decimal type.
22
//!
23
//! [`Decimal32`]: arrow_schema::DataType::Decimal32
24
//! [`Decimal64`]: arrow_schema::DataType::Decimal64
25
//! [`Decimal128`]: arrow_schema::DataType::Decimal128
26
//! [`Decimal256`]: arrow_schema::DataType::Decimal256
27
use arrow_buffer::i256;
28
use arrow_schema::ArrowError;
29
30
pub use arrow_schema::{
31
    DECIMAL128_MAX_PRECISION, DECIMAL128_MAX_SCALE, DECIMAL256_MAX_PRECISION, DECIMAL256_MAX_SCALE,
32
    DECIMAL32_DEFAULT_SCALE, DECIMAL32_MAX_PRECISION, DECIMAL32_MAX_SCALE, DECIMAL64_DEFAULT_SCALE,
33
    DECIMAL64_MAX_PRECISION, DECIMAL64_MAX_SCALE, DECIMAL_DEFAULT_SCALE,
34
};
35
36
/// `MAX_DECIMAL256_FOR_EACH_PRECISION[p]` holds the maximum [`i256`] value that can
37
/// be stored in a [`Decimal256`] value of precision `p`.
38
///
39
/// # Notes
40
///
41
/// Each element is the max value of signed 256-bit integer for the specified
42
/// precision which is encoded to the 32-byte width format of little-endian.
43
///
44
/// The first element is unused and is inserted so that we can look up using
45
/// precision as the index without the need to subtract 1 first.
46
///
47
/// # Example
48
/// ```
49
/// # use arrow_buffer::i256;
50
/// # use arrow_data::decimal::MAX_DECIMAL256_FOR_EACH_PRECISION;
51
/// assert_eq!(MAX_DECIMAL256_FOR_EACH_PRECISION[3], i256::from(999));
52
/// ```
53
///
54
/// [`Decimal256`]: arrow_schema::DataType::Decimal256
55
/// [`i256`]: arrow_buffer::i256
56
pub const MAX_DECIMAL256_FOR_EACH_PRECISION: [i256; 77] = [
57
    i256::from_i128(0_i128), // unused first element
58
    i256::from_le_bytes([
59
        9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
60
        0, 0,
61
    ]),
62
    i256::from_le_bytes([
63
        99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
64
        0, 0,
65
    ]),
66
    i256::from_le_bytes([
67
        231, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
68
        0, 0,
69
    ]),
70
    i256::from_le_bytes([
71
        15, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
72
        0, 0,
73
    ]),
74
    i256::from_le_bytes([
75
        159, 134, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
76
        0, 0, 0,
77
    ]),
78
    i256::from_le_bytes([
79
        63, 66, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
80
        0, 0, 0,
81
    ]),
82
    i256::from_le_bytes([
83
        127, 150, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
84
        0, 0, 0, 0,
85
    ]),
86
    i256::from_le_bytes([
87
        255, 224, 245, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
88
        0, 0, 0, 0,
89
    ]),
90
    i256::from_le_bytes([
91
        255, 201, 154, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
92
        0, 0, 0, 0,
93
    ]),
94
    i256::from_le_bytes([
95
        255, 227, 11, 84, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
96
        0, 0, 0, 0,
97
    ]),
98
    i256::from_le_bytes([
99
        255, 231, 118, 72, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
100
        0, 0, 0, 0,
101
    ]),
102
    i256::from_le_bytes([
103
        255, 15, 165, 212, 232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
104
        0, 0, 0, 0, 0,
105
    ]),
106
    i256::from_le_bytes([
107
        255, 159, 114, 78, 24, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
108
        0, 0, 0, 0,
109
    ]),
110
    i256::from_le_bytes([
111
        255, 63, 122, 16, 243, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
112
        0, 0, 0, 0, 0,
113
    ]),
114
    i256::from_le_bytes([
115
        255, 127, 198, 164, 126, 141, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
116
        0, 0, 0, 0, 0, 0,
117
    ]),
118
    i256::from_le_bytes([
119
        255, 255, 192, 111, 242, 134, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
120
        0, 0, 0, 0, 0, 0,
121
    ]),
122
    i256::from_le_bytes([
123
        255, 255, 137, 93, 120, 69, 99, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
124
        0, 0, 0, 0, 0,
125
    ]),
126
    i256::from_le_bytes([
127
        255, 255, 99, 167, 179, 182, 224, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
128
        0, 0, 0, 0, 0, 0,
129
    ]),
130
    i256::from_le_bytes([
131
        255, 255, 231, 137, 4, 35, 199, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
132
        0, 0, 0, 0, 0, 0,
133
    ]),
134
    i256::from_le_bytes([
135
        255, 255, 15, 99, 45, 94, 199, 107, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
136
        0, 0, 0, 0, 0, 0,
137
    ]),
138
    i256::from_le_bytes([
139
        255, 255, 159, 222, 197, 173, 201, 53, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
140
        0, 0, 0, 0, 0, 0, 0,
141
    ]),
142
    i256::from_le_bytes([
143
        255, 255, 63, 178, 186, 201, 224, 25, 30, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
144
        0, 0, 0, 0, 0, 0, 0,
145
    ]),
146
    i256::from_le_bytes([
147
        255, 255, 127, 246, 74, 225, 199, 2, 45, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
148
        0, 0, 0, 0, 0, 0, 0,
149
    ]),
150
    i256::from_le_bytes([
151
        255, 255, 255, 160, 237, 204, 206, 27, 194, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
152
        0, 0, 0, 0, 0, 0, 0, 0,
153
    ]),
154
    i256::from_le_bytes([
155
        255, 255, 255, 73, 72, 1, 20, 22, 149, 69, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
156
        0, 0, 0, 0, 0, 0,
157
    ]),
158
    i256::from_le_bytes([
159
        255, 255, 255, 227, 210, 12, 200, 220, 210, 183, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
160
        0, 0, 0, 0, 0, 0, 0, 0,
161
    ]),
162
    i256::from_le_bytes([
163
        255, 255, 255, 231, 60, 128, 208, 159, 60, 46, 59, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
164
        0, 0, 0, 0, 0, 0, 0, 0,
165
    ]),
166
    i256::from_le_bytes([
167
        255, 255, 255, 15, 97, 2, 37, 62, 94, 206, 79, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
168
        0, 0, 0, 0, 0, 0, 0,
169
    ]),
170
    i256::from_le_bytes([
171
        255, 255, 255, 159, 202, 23, 114, 109, 174, 15, 30, 67, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
172
        0, 0, 0, 0, 0, 0, 0, 0,
173
    ]),
174
    i256::from_le_bytes([
175
        255, 255, 255, 63, 234, 237, 116, 70, 208, 156, 44, 159, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
176
        0, 0, 0, 0, 0, 0, 0, 0, 0,
177
    ]),
178
    i256::from_le_bytes([
179
        255, 255, 255, 127, 38, 75, 145, 192, 34, 32, 190, 55, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
180
        0, 0, 0, 0, 0, 0, 0, 0, 0,
181
    ]),
182
    i256::from_le_bytes([
183
        255, 255, 255, 255, 128, 239, 172, 133, 91, 65, 109, 45, 238, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
184
        0, 0, 0, 0, 0, 0, 0, 0, 0,
185
    ]),
186
    i256::from_le_bytes([
187
        255, 255, 255, 255, 9, 91, 193, 56, 147, 141, 68, 198, 77, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0,
188
        0, 0, 0, 0, 0, 0, 0, 0, 0,
189
    ]),
190
    i256::from_le_bytes([
191
        255, 255, 255, 255, 99, 142, 141, 55, 192, 135, 173, 190, 9, 237, 1, 0, 0, 0, 0, 0, 0, 0,
192
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
193
    ]),
194
    i256::from_le_bytes([
195
        255, 255, 255, 255, 231, 143, 135, 43, 130, 77, 199, 114, 97, 66, 19, 0, 0, 0, 0, 0, 0, 0,
196
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
197
    ]),
198
    i256::from_le_bytes([
199
        255, 255, 255, 255, 15, 159, 75, 179, 21, 7, 201, 123, 206, 151, 192, 0, 0, 0, 0, 0, 0, 0,
200
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
201
    ]),
202
    i256::from_le_bytes([
203
        255, 255, 255, 255, 159, 54, 244, 0, 217, 70, 218, 213, 16, 238, 133, 7, 0, 0, 0, 0, 0, 0,
204
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
205
    ]),
206
    i256::from_le_bytes([
207
        255, 255, 255, 255, 63, 34, 138, 9, 122, 196, 134, 90, 168, 76, 59, 75, 0, 0, 0, 0, 0, 0,
208
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
209
    ]),
210
    i256::from_le_bytes([
211
        255, 255, 255, 255, 127, 86, 101, 95, 196, 172, 67, 137, 147, 254, 80, 240, 2, 0, 0, 0, 0,
212
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
213
    ]),
214
    i256::from_le_bytes([
215
        255, 255, 255, 255, 255, 96, 245, 185, 171, 191, 164, 92, 195, 241, 41, 99, 29, 0, 0, 0, 0,
216
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
217
    ]),
218
    i256::from_le_bytes([
219
        255, 255, 255, 255, 255, 201, 149, 67, 181, 124, 111, 158, 161, 113, 163, 223, 37, 1, 0, 0,
220
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
221
    ]),
222
    i256::from_le_bytes([
223
        255, 255, 255, 255, 255, 227, 217, 163, 20, 223, 90, 48, 80, 112, 98, 188, 122, 11, 0, 0,
224
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
225
    ]),
226
    i256::from_le_bytes([
227
        255, 255, 255, 255, 255, 231, 130, 102, 206, 182, 140, 227, 33, 99, 216, 91, 203, 114, 0,
228
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
229
    ]),
230
    i256::from_le_bytes([
231
        255, 255, 255, 255, 255, 15, 29, 1, 16, 36, 127, 227, 82, 223, 115, 150, 241, 123, 4, 0, 0,
232
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
233
    ]),
234
    i256::from_le_bytes([
235
        255, 255, 255, 255, 255, 159, 34, 11, 160, 104, 247, 226, 60, 185, 134, 224, 111, 215, 44,
236
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
237
    ]),
238
    i256::from_le_bytes([
239
        255, 255, 255, 255, 255, 63, 90, 111, 64, 22, 170, 221, 96, 60, 67, 197, 94, 106, 192, 1,
240
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
241
    ]),
242
    i256::from_le_bytes([
243
        255, 255, 255, 255, 255, 127, 134, 89, 132, 222, 164, 168, 200, 91, 160, 180, 179, 39, 132,
244
        17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
245
    ]),
246
    i256::from_le_bytes([
247
        255, 255, 255, 255, 255, 255, 64, 127, 43, 177, 112, 150, 214, 149, 67, 14, 5, 141, 41,
248
        175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
249
    ]),
250
    i256::from_le_bytes([
251
        255, 255, 255, 255, 255, 255, 137, 248, 178, 235, 102, 224, 97, 218, 163, 142, 50, 130,
252
        159, 215, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
253
    ]),
254
    i256::from_le_bytes([
255
        255, 255, 255, 255, 255, 255, 99, 181, 253, 52, 5, 196, 210, 135, 102, 146, 249, 21, 59,
256
        108, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
257
    ]),
258
    i256::from_le_bytes([
259
        255, 255, 255, 255, 255, 255, 231, 21, 233, 17, 52, 168, 59, 78, 1, 184, 191, 219, 78, 58,
260
        172, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
261
    ]),
262
    i256::from_le_bytes([
263
        255, 255, 255, 255, 255, 255, 15, 219, 26, 179, 8, 146, 84, 14, 13, 48, 125, 149, 20, 71,
264
        186, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
265
    ]),
266
    i256::from_le_bytes([
267
        255, 255, 255, 255, 255, 255, 159, 142, 12, 255, 86, 180, 77, 143, 130, 224, 227, 214, 205,
268
        198, 70, 11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
269
    ]),
270
    i256::from_le_bytes([
271
        255, 255, 255, 255, 255, 255, 63, 146, 125, 246, 101, 11, 9, 153, 25, 197, 230, 100, 10,
272
        196, 195, 112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
273
    ]),
274
    i256::from_le_bytes([
275
        255, 255, 255, 255, 255, 255, 127, 182, 231, 160, 251, 113, 90, 250, 255, 178, 3, 241, 103,
276
        168, 165, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0,
277
    ]),
278
    i256::from_le_bytes([
279
        255, 255, 255, 255, 255, 255, 255, 32, 13, 73, 212, 115, 136, 199, 255, 253, 36, 106, 15,
280
        148, 120, 12, 20, 4, 0, 0, 0, 0, 0, 0, 0, 0,
281
    ]),
282
    i256::from_le_bytes([
283
        255, 255, 255, 255, 255, 255, 255, 73, 131, 218, 74, 134, 84, 203, 253, 235, 113, 37, 154,
284
        200, 181, 124, 200, 40, 0, 0, 0, 0, 0, 0, 0, 0,
285
    ]),
286
    i256::from_le_bytes([
287
        255, 255, 255, 255, 255, 255, 255, 227, 32, 137, 236, 62, 77, 241, 233, 55, 115, 118, 5,
288
        214, 25, 223, 212, 151, 1, 0, 0, 0, 0, 0, 0, 0,
289
    ]),
290
    i256::from_le_bytes([
291
        255, 255, 255, 255, 255, 255, 255, 231, 72, 91, 61, 117, 4, 109, 35, 47, 128, 160, 54, 92,
292
        2, 183, 80, 238, 15, 0, 0, 0, 0, 0, 0, 0,
293
    ]),
294
    i256::from_le_bytes([
295
        255, 255, 255, 255, 255, 255, 255, 15, 217, 144, 101, 148, 44, 66, 98, 215, 1, 69, 34, 154,
296
        23, 38, 39, 79, 159, 0, 0, 0, 0, 0, 0, 0,
297
    ]),
298
    i256::from_le_bytes([
299
        255, 255, 255, 255, 255, 255, 255, 159, 122, 168, 247, 203, 189, 149, 214, 105, 18, 178,
300
        86, 5, 236, 124, 135, 23, 57, 6, 0, 0, 0, 0, 0, 0,
301
    ]),
302
    i256::from_le_bytes([
303
        255, 255, 255, 255, 255, 255, 255, 63, 202, 148, 172, 247, 105, 217, 97, 34, 184, 244, 98,
304
        53, 56, 225, 74, 235, 58, 62, 0, 0, 0, 0, 0, 0,
305
    ]),
306
    i256::from_le_bytes([
307
        255, 255, 255, 255, 255, 255, 255, 127, 230, 207, 189, 172, 35, 126, 210, 87, 49, 143, 221,
308
        21, 50, 204, 236, 48, 77, 110, 2, 0, 0, 0, 0, 0,
309
    ]),
310
    i256::from_le_bytes([
311
        255, 255, 255, 255, 255, 255, 255, 255, 0, 31, 106, 191, 100, 237, 56, 110, 237, 151, 167,
312
        218, 244, 249, 63, 233, 3, 79, 24, 0, 0, 0, 0, 0,
313
    ]),
314
    i256::from_le_bytes([
315
        255, 255, 255, 255, 255, 255, 255, 255, 9, 54, 37, 122, 239, 69, 57, 78, 70, 239, 139, 138,
316
        144, 195, 127, 28, 39, 22, 243, 0, 0, 0, 0, 0,
317
    ]),
318
    i256::from_le_bytes([
319
        255, 255, 255, 255, 255, 255, 255, 255, 99, 28, 116, 197, 90, 187, 60, 14, 191, 88, 119,
320
        105, 165, 163, 253, 28, 135, 221, 126, 9, 0, 0, 0, 0,
321
    ]),
322
    i256::from_le_bytes([
323
        255, 255, 255, 255, 255, 255, 255, 255, 231, 27, 137, 182, 139, 81, 95, 142, 118, 119, 169,
324
        30, 118, 100, 232, 33, 71, 167, 244, 94, 0, 0, 0, 0,
325
    ]),
326
    i256::from_le_bytes([
327
        255, 255, 255, 255, 255, 255, 255, 255, 15, 23, 91, 33, 117, 47, 185, 143, 161, 170, 158,
328
        50, 157, 236, 19, 83, 199, 136, 142, 181, 3, 0, 0, 0,
329
    ]),
330
    i256::from_le_bytes([
331
        255, 255, 255, 255, 255, 255, 255, 255, 159, 230, 142, 77, 147, 218, 59, 157, 79, 170, 50,
332
        250, 35, 62, 199, 62, 201, 87, 145, 23, 37, 0, 0, 0,
333
    ]),
334
    i256::from_le_bytes([
335
        255, 255, 255, 255, 255, 255, 255, 255, 63, 2, 149, 7, 193, 137, 86, 36, 28, 167, 250, 197,
336
        103, 109, 200, 115, 220, 109, 173, 235, 114, 1, 0, 0,
337
    ]),
338
    i256::from_le_bytes([
339
        255, 255, 255, 255, 255, 255, 255, 255, 127, 22, 210, 75, 138, 97, 97, 107, 25, 135, 202,
340
        187, 13, 70, 212, 133, 156, 74, 198, 52, 125, 14, 0, 0,
341
    ]),
342
    i256::from_le_bytes([
343
        255, 255, 255, 255, 255, 255, 255, 255, 255, 224, 52, 246, 102, 207, 205, 49, 254, 70, 233,
344
        85, 137, 188, 74, 58, 29, 234, 190, 15, 228, 144, 0, 0,
345
    ]),
346
    i256::from_le_bytes([
347
        255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 16, 158, 5, 26, 10, 242, 237, 197, 28,
348
        91, 93, 93, 235, 70, 36, 37, 117, 157, 232, 168, 5, 0,
349
    ]),
350
    i256::from_le_bytes([
351
        255, 255, 255, 255, 255, 255, 255, 255, 255, 227, 167, 44, 56, 4, 101, 116, 75, 187, 31,
352
        143, 165, 165, 49, 197, 106, 115, 147, 38, 22, 153, 56, 0,
353
    ]),
354
    i256::from_le_bytes([
355
        255, 255, 255, 255, 255, 255, 255, 255, 255, 231, 142, 190, 49, 42, 242, 139, 242, 80, 61,
356
        151, 119, 120, 240, 179, 43, 130, 194, 129, 221, 250, 53, 2,
357
    ]),
358
    i256::from_le_bytes([
359
        255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 149, 113, 241, 165, 117, 119, 121, 41,
360
        101, 232, 171, 180, 100, 7, 181, 21, 153, 17, 167, 204, 27, 22,
361
    ]),
362
];
363
364
/// `MIN_DECIMAL256_FOR_EACH_PRECISION[p]` holds the minimum [`i256`] value that can
365
/// be stored in a [`Decimal256`] value of precision `p`.
366
///
367
/// # Notes
368
///
369
/// Each element is the min value of signed 256-bit integer for the specified precision which
370
/// is encoded to the 76-byte width format of little-endian.
371
///
372
/// The first element is unused and is inserted so that we can look up using
373
/// precision as the index without the need to subtract 1 first.
374
/// # Example
375
/// ```
376
/// # use arrow_buffer::i256;
377
/// # use arrow_data::decimal::MIN_DECIMAL256_FOR_EACH_PRECISION;
378
/// assert_eq!(MIN_DECIMAL256_FOR_EACH_PRECISION[3], i256::from(-999));
379
/// ```
380
///
381
/// [`i256`]: arrow_buffer::i256
382
/// [`Decimal256`]: arrow_schema::DataType::Decimal256
383
pub const MIN_DECIMAL256_FOR_EACH_PRECISION: [i256; 77] = [
384
    i256::from_i128(0_i128), // unused first element
385
    i256::from_le_bytes([
386
        247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
387
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
388
    ]),
389
    i256::from_le_bytes([
390
        157, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
391
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
392
    ]),
393
    i256::from_le_bytes([
394
        25, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
395
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
396
    ]),
397
    i256::from_le_bytes([
398
        241, 216, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
399
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
400
    ]),
401
    i256::from_le_bytes([
402
        97, 121, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
403
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
404
    ]),
405
    i256::from_le_bytes([
406
        193, 189, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
407
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
408
    ]),
409
    i256::from_le_bytes([
410
        129, 105, 103, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
411
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
412
    ]),
413
    i256::from_le_bytes([
414
        1, 31, 10, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
415
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
416
    ]),
417
    i256::from_le_bytes([
418
        1, 54, 101, 196, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
419
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
420
    ]),
421
    i256::from_le_bytes([
422
        1, 28, 244, 171, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
423
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
424
    ]),
425
    i256::from_le_bytes([
426
        1, 24, 137, 183, 232, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
427
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
428
    ]),
429
    i256::from_le_bytes([
430
        1, 240, 90, 43, 23, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
431
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
432
    ]),
433
    i256::from_le_bytes([
434
        1, 96, 141, 177, 231, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
435
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
436
    ]),
437
    i256::from_le_bytes([
438
        1, 192, 133, 239, 12, 165, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
439
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
440
    ]),
441
    i256::from_le_bytes([
442
        1, 128, 57, 91, 129, 114, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
443
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
444
    ]),
445
    i256::from_le_bytes([
446
        1, 0, 63, 144, 13, 121, 220, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
447
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
448
    ]),
449
    i256::from_le_bytes([
450
        1, 0, 118, 162, 135, 186, 156, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
451
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
452
    ]),
453
    i256::from_le_bytes([
454
        1, 0, 156, 88, 76, 73, 31, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
455
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
456
    ]),
457
    i256::from_le_bytes([
458
        1, 0, 24, 118, 251, 220, 56, 117, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
459
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
460
    ]),
461
    i256::from_le_bytes([
462
        1, 0, 240, 156, 210, 161, 56, 148, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
463
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
464
    ]),
465
    i256::from_le_bytes([
466
        1, 0, 96, 33, 58, 82, 54, 202, 201, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
467
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
468
    ]),
469
    i256::from_le_bytes([
470
        1, 0, 192, 77, 69, 54, 31, 230, 225, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
471
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
472
    ]),
473
    i256::from_le_bytes([
474
        1, 0, 128, 9, 181, 30, 56, 253, 210, 234, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
475
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
476
    ]),
477
    i256::from_le_bytes([
478
        1, 0, 0, 95, 18, 51, 49, 228, 61, 44, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
479
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
480
    ]),
481
    i256::from_le_bytes([
482
        1, 0, 0, 182, 183, 254, 235, 233, 106, 186, 247, 255, 255, 255, 255, 255, 255, 255, 255,
483
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
484
    ]),
485
    i256::from_le_bytes([
486
        1, 0, 0, 28, 45, 243, 55, 35, 45, 72, 173, 255, 255, 255, 255, 255, 255, 255, 255, 255,
487
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
488
    ]),
489
    i256::from_le_bytes([
490
        1, 0, 0, 24, 195, 127, 47, 96, 195, 209, 196, 252, 255, 255, 255, 255, 255, 255, 255, 255,
491
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
492
    ]),
493
    i256::from_le_bytes([
494
        1, 0, 0, 240, 158, 253, 218, 193, 161, 49, 176, 223, 255, 255, 255, 255, 255, 255, 255,
495
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
496
    ]),
497
    i256::from_le_bytes([
498
        1, 0, 0, 96, 53, 232, 141, 146, 81, 240, 225, 188, 254, 255, 255, 255, 255, 255, 255, 255,
499
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
500
    ]),
501
    i256::from_le_bytes([
502
        1, 0, 0, 192, 21, 18, 139, 185, 47, 99, 211, 96, 243, 255, 255, 255, 255, 255, 255, 255,
503
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
504
    ]),
505
    i256::from_le_bytes([
506
        1, 0, 0, 128, 217, 180, 110, 63, 221, 223, 65, 200, 129, 255, 255, 255, 255, 255, 255, 255,
507
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
508
    ]),
509
    i256::from_le_bytes([
510
        1, 0, 0, 0, 127, 16, 83, 122, 164, 190, 146, 210, 17, 251, 255, 255, 255, 255, 255, 255,
511
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
512
    ]),
513
    i256::from_le_bytes([
514
        1, 0, 0, 0, 246, 164, 62, 199, 108, 114, 187, 57, 178, 206, 255, 255, 255, 255, 255, 255,
515
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
516
    ]),
517
    i256::from_le_bytes([
518
        1, 0, 0, 0, 156, 113, 114, 200, 63, 120, 82, 65, 246, 18, 254, 255, 255, 255, 255, 255,
519
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
520
    ]),
521
    i256::from_le_bytes([
522
        1, 0, 0, 0, 24, 112, 120, 212, 125, 178, 56, 141, 158, 189, 236, 255, 255, 255, 255, 255,
523
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
524
    ]),
525
    i256::from_le_bytes([
526
        1, 0, 0, 0, 240, 96, 180, 76, 234, 248, 54, 132, 49, 104, 63, 255, 255, 255, 255, 255, 255,
527
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
528
    ]),
529
    i256::from_le_bytes([
530
        1, 0, 0, 0, 96, 201, 11, 255, 38, 185, 37, 42, 239, 17, 122, 248, 255, 255, 255, 255, 255,
531
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
532
    ]),
533
    i256::from_le_bytes([
534
        1, 0, 0, 0, 192, 221, 117, 246, 133, 59, 121, 165, 87, 179, 196, 180, 255, 255, 255, 255,
535
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
536
    ]),
537
    i256::from_le_bytes([
538
        1, 0, 0, 0, 128, 169, 154, 160, 59, 83, 188, 118, 108, 1, 175, 15, 253, 255, 255, 255, 255,
539
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
540
    ]),
541
    i256::from_le_bytes([
542
        1, 0, 0, 0, 0, 159, 10, 70, 84, 64, 91, 163, 60, 14, 214, 156, 226, 255, 255, 255, 255,
543
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
544
    ]),
545
    i256::from_le_bytes([
546
        1, 0, 0, 0, 0, 54, 106, 188, 74, 131, 144, 97, 94, 142, 92, 32, 218, 254, 255, 255, 255,
547
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
548
    ]),
549
    i256::from_le_bytes([
550
        1, 0, 0, 0, 0, 28, 38, 92, 235, 32, 165, 207, 175, 143, 157, 67, 133, 244, 255, 255, 255,
551
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
552
    ]),
553
    i256::from_le_bytes([
554
        1, 0, 0, 0, 0, 24, 125, 153, 49, 73, 115, 28, 222, 156, 39, 164, 52, 141, 255, 255, 255,
555
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
556
    ]),
557
    i256::from_le_bytes([
558
        1, 0, 0, 0, 0, 240, 226, 254, 239, 219, 128, 28, 173, 32, 140, 105, 14, 132, 251, 255, 255,
559
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
560
    ]),
561
    i256::from_le_bytes([
562
        1, 0, 0, 0, 0, 96, 221, 244, 95, 151, 8, 29, 195, 70, 121, 31, 144, 40, 211, 255, 255, 255,
563
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
564
    ]),
565
    i256::from_le_bytes([
566
        1, 0, 0, 0, 0, 192, 165, 144, 191, 233, 85, 34, 159, 195, 188, 58, 161, 149, 63, 254, 255,
567
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
568
    ]),
569
    i256::from_le_bytes([
570
        1, 0, 0, 0, 0, 128, 121, 166, 123, 33, 91, 87, 55, 164, 95, 75, 76, 216, 123, 238, 255,
571
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
572
    ]),
573
    i256::from_le_bytes([
574
        1, 0, 0, 0, 0, 0, 191, 128, 212, 78, 143, 105, 41, 106, 188, 241, 250, 114, 214, 80, 255,
575
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
576
    ]),
577
    i256::from_le_bytes([
578
        1, 0, 0, 0, 0, 0, 118, 7, 77, 20, 153, 31, 158, 37, 92, 113, 205, 125, 96, 40, 249, 255,
579
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
580
    ]),
581
    i256::from_le_bytes([
582
        1, 0, 0, 0, 0, 0, 156, 74, 2, 203, 250, 59, 45, 120, 153, 109, 6, 234, 196, 147, 187, 255,
583
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
584
    ]),
585
    i256::from_le_bytes([
586
        1, 0, 0, 0, 0, 0, 24, 234, 22, 238, 203, 87, 196, 177, 254, 71, 64, 36, 177, 197, 83, 253,
587
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
588
    ]),
589
    i256::from_le_bytes([
590
        1, 0, 0, 0, 0, 0, 240, 36, 229, 76, 247, 109, 171, 241, 242, 207, 130, 106, 235, 184, 69,
591
        229, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
592
    ]),
593
    i256::from_le_bytes([
594
        1, 0, 0, 0, 0, 0, 96, 113, 243, 0, 169, 75, 178, 112, 125, 31, 28, 41, 50, 57, 185, 244,
595
        254, 255, 255, 255, 255, 255, 255, 255, 255, 255,
596
    ]),
597
    i256::from_le_bytes([
598
        1, 0, 0, 0, 0, 0, 192, 109, 130, 9, 154, 244, 246, 102, 230, 58, 25, 155, 245, 59, 60, 143,
599
        245, 255, 255, 255, 255, 255, 255, 255, 255, 255,
600
    ]),
601
    i256::from_le_bytes([
602
        1, 0, 0, 0, 0, 0, 128, 73, 24, 95, 4, 142, 165, 5, 0, 77, 252, 14, 152, 87, 90, 152, 151,
603
        255, 255, 255, 255, 255, 255, 255, 255, 255,
604
    ]),
605
    i256::from_le_bytes([
606
        1, 0, 0, 0, 0, 0, 0, 223, 242, 182, 43, 140, 119, 56, 0, 2, 219, 149, 240, 107, 135, 243,
607
        235, 251, 255, 255, 255, 255, 255, 255, 255, 255,
608
    ]),
609
    i256::from_le_bytes([
610
        1, 0, 0, 0, 0, 0, 0, 182, 124, 37, 181, 121, 171, 52, 2, 20, 142, 218, 101, 55, 74, 131,
611
        55, 215, 255, 255, 255, 255, 255, 255, 255, 255,
612
    ]),
613
    i256::from_le_bytes([
614
        1, 0, 0, 0, 0, 0, 0, 28, 223, 118, 19, 193, 178, 14, 22, 200, 140, 137, 250, 41, 230, 32,
615
        43, 104, 254, 255, 255, 255, 255, 255, 255, 255,
616
    ]),
617
    i256::from_le_bytes([
618
        1, 0, 0, 0, 0, 0, 0, 24, 183, 164, 194, 138, 251, 146, 220, 208, 127, 95, 201, 163, 253,
619
        72, 175, 17, 240, 255, 255, 255, 255, 255, 255, 255,
620
    ]),
621
    i256::from_le_bytes([
622
        1, 0, 0, 0, 0, 0, 0, 240, 38, 111, 154, 107, 211, 189, 157, 40, 254, 186, 221, 101, 232,
623
        217, 216, 176, 96, 255, 255, 255, 255, 255, 255, 255,
624
    ]),
625
    i256::from_le_bytes([
626
        1, 0, 0, 0, 0, 0, 0, 96, 133, 87, 8, 52, 66, 106, 41, 150, 237, 77, 169, 250, 19, 131, 120,
627
        232, 198, 249, 255, 255, 255, 255, 255, 255,
628
    ]),
629
    i256::from_le_bytes([
630
        1, 0, 0, 0, 0, 0, 0, 192, 53, 107, 83, 8, 150, 38, 158, 221, 71, 11, 157, 202, 199, 30,
631
        181, 20, 197, 193, 255, 255, 255, 255, 255, 255,
632
    ]),
633
    i256::from_le_bytes([
634
        1, 0, 0, 0, 0, 0, 0, 128, 25, 48, 66, 83, 220, 129, 45, 168, 206, 112, 34, 234, 205, 51,
635
        19, 207, 178, 145, 253, 255, 255, 255, 255, 255,
636
    ]),
637
    i256::from_le_bytes([
638
        1, 0, 0, 0, 0, 0, 0, 0, 255, 224, 149, 64, 155, 18, 199, 145, 18, 104, 88, 37, 11, 6, 192,
639
        22, 252, 176, 231, 255, 255, 255, 255, 255,
640
    ]),
641
    i256::from_le_bytes([
642
        1, 0, 0, 0, 0, 0, 0, 0, 246, 201, 218, 133, 16, 186, 198, 177, 185, 16, 116, 117, 111, 60,
643
        128, 227, 216, 233, 12, 255, 255, 255, 255, 255,
644
    ]),
645
    i256::from_le_bytes([
646
        1, 0, 0, 0, 0, 0, 0, 0, 156, 227, 139, 58, 165, 68, 195, 241, 64, 167, 136, 150, 90, 92, 2,
647
        227, 120, 34, 129, 246, 255, 255, 255, 255,
648
    ]),
649
    i256::from_le_bytes([
650
        1, 0, 0, 0, 0, 0, 0, 0, 24, 228, 118, 73, 116, 174, 160, 113, 137, 136, 86, 225, 137, 155,
651
        23, 222, 184, 88, 11, 161, 255, 255, 255, 255,
652
    ]),
653
    i256::from_le_bytes([
654
        1, 0, 0, 0, 0, 0, 0, 0, 240, 232, 164, 222, 138, 208, 70, 112, 94, 85, 97, 205, 98, 19,
655
        236, 172, 56, 119, 113, 74, 252, 255, 255, 255,
656
    ]),
657
    i256::from_le_bytes([
658
        1, 0, 0, 0, 0, 0, 0, 0, 96, 25, 113, 178, 108, 37, 196, 98, 176, 85, 205, 5, 220, 193, 56,
659
        193, 54, 168, 110, 232, 218, 255, 255, 255,
660
    ]),
661
    i256::from_le_bytes([
662
        1, 0, 0, 0, 0, 0, 0, 0, 192, 253, 106, 248, 62, 118, 169, 219, 227, 88, 5, 58, 152, 146,
663
        55, 140, 35, 146, 82, 20, 141, 254, 255, 255,
664
    ]),
665
    i256::from_le_bytes([
666
        1, 0, 0, 0, 0, 0, 0, 0, 128, 233, 45, 180, 117, 158, 158, 148, 230, 120, 53, 68, 242, 185,
667
        43, 122, 99, 181, 57, 203, 130, 241, 255, 255,
668
    ]),
669
    i256::from_le_bytes([
670
        1, 0, 0, 0, 0, 0, 0, 0, 0, 31, 203, 9, 153, 48, 50, 206, 1, 185, 22, 170, 118, 67, 181,
671
        197, 226, 21, 65, 240, 27, 111, 255, 255,
672
    ]),
673
    i256::from_le_bytes([
674
        1, 0, 0, 0, 0, 0, 0, 0, 0, 54, 239, 97, 250, 229, 245, 13, 18, 58, 227, 164, 162, 162, 20,
675
        185, 219, 218, 138, 98, 23, 87, 250, 255,
676
    ]),
677
    i256::from_le_bytes([
678
        1, 0, 0, 0, 0, 0, 0, 0, 0, 28, 88, 211, 199, 251, 154, 139, 180, 68, 224, 112, 90, 90, 206,
679
        58, 149, 140, 108, 217, 233, 102, 199, 255,
680
    ]),
681
    i256::from_le_bytes([
682
        1, 0, 0, 0, 0, 0, 0, 0, 0, 24, 113, 65, 206, 213, 13, 116, 13, 175, 194, 104, 136, 135, 15,
683
        76, 212, 125, 61, 126, 34, 5, 202, 253,
684
    ]),
685
    i256::from_le_bytes([
686
        1, 0, 0, 0, 0, 0, 0, 0, 0, 240, 106, 142, 14, 90, 138, 136, 134, 214, 154, 23, 84, 75, 155,
687
        248, 74, 234, 102, 238, 88, 51, 228, 233,
688
    ]),
689
];
690
691
/// `MAX_DECIMAL_FOR_EACH_PRECISION[p-1]` holds the maximum `i128` value that can
692
/// be stored in a [`Decimal128`] value of precision `p`
693
///
694
/// [`Decimal128`]: arrow_schema::DataType::Decimal128
695
#[deprecated(
696
    since = "54.1.0",
697
    note = "Use MAX_DECIMAL128_FOR_EACH_PRECISION (note indexes are different)"
698
)]
699
#[allow(dead_code)] // no longer used but is part of our public API
700
pub const MAX_DECIMAL_FOR_EACH_PRECISION: [i128; 38] = [
701
    9,
702
    99,
703
    999,
704
    9999,
705
    99999,
706
    999999,
707
    9999999,
708
    99999999,
709
    999999999,
710
    9999999999,
711
    99999999999,
712
    999999999999,
713
    9999999999999,
714
    99999999999999,
715
    999999999999999,
716
    9999999999999999,
717
    99999999999999999,
718
    999999999999999999,
719
    9999999999999999999,
720
    99999999999999999999,
721
    999999999999999999999,
722
    9999999999999999999999,
723
    99999999999999999999999,
724
    999999999999999999999999,
725
    9999999999999999999999999,
726
    99999999999999999999999999,
727
    999999999999999999999999999,
728
    9999999999999999999999999999,
729
    99999999999999999999999999999,
730
    999999999999999999999999999999,
731
    9999999999999999999999999999999,
732
    99999999999999999999999999999999,
733
    999999999999999999999999999999999,
734
    9999999999999999999999999999999999,
735
    99999999999999999999999999999999999,
736
    999999999999999999999999999999999999,
737
    9999999999999999999999999999999999999,
738
    99999999999999999999999999999999999999,
739
];
740
741
/// `MIN_DECIMAL_FOR_EACH_PRECISION[p-1]` holds the minimum `i128` value that can
742
/// be stored in a [`Decimal128`] value of precision `p`
743
///
744
/// [`Decimal128`]: arrow_schema::DataType::Decimal128
745
#[allow(dead_code)] // no longer used but is part of our public API
746
#[deprecated(
747
    since = "54.1.0",
748
    note = "Use MIN_DECIMAL128_FOR_EACH_PRECISION (note indexes are different)"
749
)]
750
pub const MIN_DECIMAL_FOR_EACH_PRECISION: [i128; 38] = [
751
    -9,
752
    -99,
753
    -999,
754
    -9999,
755
    -99999,
756
    -999999,
757
    -9999999,
758
    -99999999,
759
    -999999999,
760
    -9999999999,
761
    -99999999999,
762
    -999999999999,
763
    -9999999999999,
764
    -99999999999999,
765
    -999999999999999,
766
    -9999999999999999,
767
    -99999999999999999,
768
    -999999999999999999,
769
    -9999999999999999999,
770
    -99999999999999999999,
771
    -999999999999999999999,
772
    -9999999999999999999999,
773
    -99999999999999999999999,
774
    -999999999999999999999999,
775
    -9999999999999999999999999,
776
    -99999999999999999999999999,
777
    -999999999999999999999999999,
778
    -9999999999999999999999999999,
779
    -99999999999999999999999999999,
780
    -999999999999999999999999999999,
781
    -9999999999999999999999999999999,
782
    -99999999999999999999999999999999,
783
    -999999999999999999999999999999999,
784
    -9999999999999999999999999999999999,
785
    -99999999999999999999999999999999999,
786
    -999999999999999999999999999999999999,
787
    -9999999999999999999999999999999999999,
788
    -99999999999999999999999999999999999999,
789
];
790
791
/// `MAX_DECIMAL128_FOR_EACH_PRECISION[p]` holds the maximum `i128` value that can
792
/// be stored in [`Decimal128`] value of precision `p`.
793
///
794
/// # Notes
795
///
796
/// The first element is unused and is inserted so that we can look up using
797
/// precision as the index without the need to subtract 1 first.
798
///
799
/// # Example
800
/// ```
801
/// # use arrow_data::decimal::MAX_DECIMAL128_FOR_EACH_PRECISION;
802
/// assert_eq!(MAX_DECIMAL128_FOR_EACH_PRECISION[3], 999);
803
/// ```
804
///
805
/// [`Decimal128`]: arrow_schema::DataType::Decimal128
806
pub const MAX_DECIMAL128_FOR_EACH_PRECISION: [i128; 39] = [
807
    0, // unused first element
808
    9,
809
    99,
810
    999,
811
    9999,
812
    99999,
813
    999999,
814
    9999999,
815
    99999999,
816
    999999999,
817
    9999999999,
818
    99999999999,
819
    999999999999,
820
    9999999999999,
821
    99999999999999,
822
    999999999999999,
823
    9999999999999999,
824
    99999999999999999,
825
    999999999999999999,
826
    9999999999999999999,
827
    99999999999999999999,
828
    999999999999999999999,
829
    9999999999999999999999,
830
    99999999999999999999999,
831
    999999999999999999999999,
832
    9999999999999999999999999,
833
    99999999999999999999999999,
834
    999999999999999999999999999,
835
    9999999999999999999999999999,
836
    99999999999999999999999999999,
837
    999999999999999999999999999999,
838
    9999999999999999999999999999999,
839
    99999999999999999999999999999999,
840
    999999999999999999999999999999999,
841
    9999999999999999999999999999999999,
842
    99999999999999999999999999999999999,
843
    999999999999999999999999999999999999,
844
    9999999999999999999999999999999999999,
845
    99999999999999999999999999999999999999,
846
];
847
848
/// `MIN_DECIMAL_FOR_EACH_PRECISION[p]` holds the minimum `i128` value that can
849
/// be stored in a [`Decimal128`] value of precision `p`.
850
///
851
/// # Notes
852
///
853
/// The first element is unused and is inserted so that we can look up using
854
/// precision as the index without the need to subtract 1 first.
855
///
856
/// # Example
857
/// ```
858
/// # use arrow_data::decimal::MIN_DECIMAL128_FOR_EACH_PRECISION;
859
/// assert_eq!(MIN_DECIMAL128_FOR_EACH_PRECISION[3], -999);
860
/// ```
861
///
862
/// [`Decimal128`]: arrow_schema::DataType::Decimal128
863
pub const MIN_DECIMAL128_FOR_EACH_PRECISION: [i128; 39] = [
864
    0, // unused first element
865
    -9,
866
    -99,
867
    -999,
868
    -9999,
869
    -99999,
870
    -999999,
871
    -9999999,
872
    -99999999,
873
    -999999999,
874
    -9999999999,
875
    -99999999999,
876
    -999999999999,
877
    -9999999999999,
878
    -99999999999999,
879
    -999999999999999,
880
    -9999999999999999,
881
    -99999999999999999,
882
    -999999999999999999,
883
    -9999999999999999999,
884
    -99999999999999999999,
885
    -999999999999999999999,
886
    -9999999999999999999999,
887
    -99999999999999999999999,
888
    -999999999999999999999999,
889
    -9999999999999999999999999,
890
    -99999999999999999999999999,
891
    -999999999999999999999999999,
892
    -9999999999999999999999999999,
893
    -99999999999999999999999999999,
894
    -999999999999999999999999999999,
895
    -9999999999999999999999999999999,
896
    -99999999999999999999999999999999,
897
    -999999999999999999999999999999999,
898
    -9999999999999999999999999999999999,
899
    -99999999999999999999999999999999999,
900
    -999999999999999999999999999999999999,
901
    -9999999999999999999999999999999999999,
902
    -99999999999999999999999999999999999999,
903
];
904
905
/// `MAX_DECIMAL64_FOR_EACH_PRECISION[p]` holds the maximum `i64` value that can
906
/// be stored in [`Decimal64`] value of precision `p`.
907
///
908
/// # Notes
909
///
910
/// The first element is unused and is inserted so that we can look up using
911
/// precision as the index without the need to subtract 1 first.
912
///
913
/// # Example
914
/// ```
915
/// # use arrow_data::decimal::MAX_DECIMAL64_FOR_EACH_PRECISION;
916
/// assert_eq!(MAX_DECIMAL64_FOR_EACH_PRECISION[3], 999);
917
/// ```
918
///
919
/// [`Decimal64`]: arrow_schema::DataType::Decimal64
920
pub const MAX_DECIMAL64_FOR_EACH_PRECISION: [i64; 19] = [
921
    0, // unused first element
922
    9,
923
    99,
924
    999,
925
    9999,
926
    99999,
927
    999999,
928
    9999999,
929
    99999999,
930
    999999999,
931
    9999999999,
932
    99999999999,
933
    999999999999,
934
    9999999999999,
935
    99999999999999,
936
    999999999999999,
937
    9999999999999999,
938
    99999999999999999,
939
    999999999999999999,
940
];
941
942
/// `MIN_DECIMAL64_FOR_EACH_PRECISION[p]` holds the minimum `i64` value that can
943
/// be stored in a [`Decimal64`] value of precision `p`.
944
///
945
/// # Notes
946
///
947
/// The first element is unused and is inserted so that we can look up using
948
/// precision as the index without the need to subtract 1 first.
949
///
950
/// # Example
951
/// ```
952
/// # use arrow_data::decimal::MIN_DECIMAL64_FOR_EACH_PRECISION;
953
/// assert_eq!(MIN_DECIMAL64_FOR_EACH_PRECISION[3], -999);
954
/// ```
955
///
956
/// [`Decimal64`]: arrow_schema::DataType::Decimal64
957
pub const MIN_DECIMAL64_FOR_EACH_PRECISION: [i64; 19] = [
958
    0, // unused first element
959
    -9,
960
    -99,
961
    -999,
962
    -9999,
963
    -99999,
964
    -999999,
965
    -9999999,
966
    -99999999,
967
    -999999999,
968
    -9999999999,
969
    -99999999999,
970
    -999999999999,
971
    -9999999999999,
972
    -99999999999999,
973
    -999999999999999,
974
    -9999999999999999,
975
    -99999999999999999,
976
    -999999999999999999,
977
];
978
979
/// `MAX_DECIMAL32_FOR_EACH_PRECISION[p]` holds the maximum `i32` value that can
980
/// be stored in [`Decimal32`] value of precision `p`.
981
///
982
/// # Notes
983
///
984
/// The first element is unused and is inserted so that we can look up using
985
/// precision as the index without the need to subtract 1 first.
986
///
987
/// # Example
988
/// ```
989
/// # use arrow_data::decimal::MAX_DECIMAL32_FOR_EACH_PRECISION;
990
/// assert_eq!(MAX_DECIMAL32_FOR_EACH_PRECISION[3], 999);
991
/// ```
992
///
993
/// [`Decimal32`]: arrow_schema::DataType::Decimal32
994
pub const MAX_DECIMAL32_FOR_EACH_PRECISION: [i32; 10] = [
995
    0, // unused first element
996
    9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999,
997
];
998
999
/// `MIN_DECIMAL32_FOR_EACH_PRECISION[p]` holds the minimum `ialue that can
1000
/// be stored in a [`Decimal32`] value of precision `p`.
1001
///
1002
/// # Notes
1003
///
1004
/// The first element is unused and is inserted so that we can look up using
1005
/// precision as the index without the need to subtract 1 first.
1006
///
1007
/// # Example
1008
/// ```
1009
/// # use arrow_data::decimal::MIN_DECIMAL32_FOR_EACH_PRECISION;
1010
/// assert_eq!(MIN_DECIMAL32_FOR_EACH_PRECISION[3], -999);
1011
/// ```
1012
///
1013
/// [`Decimal32`]: arrow_schema::DataType::Decimal32
1014
pub const MIN_DECIMAL32_FOR_EACH_PRECISION: [i32; 10] = [
1015
    0, // unused first element
1016
    -9, -99, -999, -9999, -99999, -999999, -9999999, -99999999, -999999999,
1017
];
1018
1019
/// Validates that the specified `i32` value can be properly
1020
/// interpreted as a [`Decimal32`] number with precision `precision`
1021
///
1022
/// [`Decimal32`]: arrow_schema::DataType::Decimal32
1023
#[inline]
1024
0
pub fn validate_decimal32_precision(value: i32, precision: u8) -> Result<(), ArrowError> {
1025
0
    if precision > DECIMAL32_MAX_PRECISION {
1026
0
        return Err(ArrowError::InvalidArgumentError(format!(
1027
0
            "Max precision of a Decimal32 is {DECIMAL32_MAX_PRECISION}, but got {precision}",
1028
0
        )));
1029
0
    }
1030
0
    if value > MAX_DECIMAL32_FOR_EACH_PRECISION[precision as usize] {
1031
0
        Err(ArrowError::InvalidArgumentError(format!(
1032
0
            "{value} is too large to store in a Decimal32 of precision {precision}. Max is {}",
1033
0
            MAX_DECIMAL32_FOR_EACH_PRECISION[precision as usize]
1034
0
        )))
1035
0
    } else if value < MIN_DECIMAL32_FOR_EACH_PRECISION[precision as usize] {
1036
0
        Err(ArrowError::InvalidArgumentError(format!(
1037
0
            "{value} is too small to store in a Decimal32 of precision {precision}. Min is {}",
1038
0
            MIN_DECIMAL32_FOR_EACH_PRECISION[precision as usize]
1039
0
        )))
1040
    } else {
1041
0
        Ok(())
1042
    }
1043
0
}
1044
1045
/// Returns true if the specified `i32` value can be properly
1046
/// interpreted as a [`Decimal32`] number with precision `precision`
1047
///
1048
/// [`Decimal32`]: arrow_schema::DataType::Decimal32
1049
#[inline]
1050
0
pub fn is_validate_decimal32_precision(value: i32, precision: u8) -> bool {
1051
0
    precision <= DECIMAL32_MAX_PRECISION
1052
0
        && value >= MIN_DECIMAL32_FOR_EACH_PRECISION[precision as usize]
1053
0
        && value <= MAX_DECIMAL32_FOR_EACH_PRECISION[precision as usize]
1054
0
}
1055
1056
/// Validates that the specified `i64` value can be properly
1057
/// interpreted as a [`Decimal64`] number with precision `precision`
1058
///
1059
/// [`Decimal64`]: arrow_schema::DataType::Decimal64
1060
#[inline]
1061
0
pub fn validate_decimal64_precision(value: i64, precision: u8) -> Result<(), ArrowError> {
1062
0
    if precision > DECIMAL64_MAX_PRECISION {
1063
0
        return Err(ArrowError::InvalidArgumentError(format!(
1064
0
            "Max precision of a Decimal64 is {DECIMAL64_MAX_PRECISION}, but got {precision}",
1065
0
        )));
1066
0
    }
1067
0
    if value > MAX_DECIMAL64_FOR_EACH_PRECISION[precision as usize] {
1068
0
        Err(ArrowError::InvalidArgumentError(format!(
1069
0
            "{value} is too large to store in a Decimal64 of precision {precision}. Max is {}",
1070
0
            MAX_DECIMAL64_FOR_EACH_PRECISION[precision as usize]
1071
0
        )))
1072
0
    } else if value < MIN_DECIMAL64_FOR_EACH_PRECISION[precision as usize] {
1073
0
        Err(ArrowError::InvalidArgumentError(format!(
1074
0
            "{value} is too small to store in a Decimal64 of precision {precision}. Min is {}",
1075
0
            MIN_DECIMAL64_FOR_EACH_PRECISION[precision as usize]
1076
0
        )))
1077
    } else {
1078
0
        Ok(())
1079
    }
1080
0
}
1081
1082
/// Returns true if the specified `i64` value can be properly
1083
/// interpreted as a [`Decimal64`] number with precision `precision`
1084
///
1085
/// [`Decimal64`]: arrow_schema::DataType::Decimal64
1086
#[inline]
1087
0
pub fn is_validate_decimal64_precision(value: i64, precision: u8) -> bool {
1088
0
    precision <= DECIMAL64_MAX_PRECISION
1089
0
        && value >= MIN_DECIMAL64_FOR_EACH_PRECISION[precision as usize]
1090
0
        && value <= MAX_DECIMAL64_FOR_EACH_PRECISION[precision as usize]
1091
0
}
1092
1093
/// Validates that the specified `i128` value can be properly
1094
/// interpreted as a [`Decimal128`] number with precision `precision`
1095
///
1096
/// [`Decimal128`]: arrow_schema::DataType::Decimal128
1097
#[inline]
1098
0
pub fn validate_decimal_precision(value: i128, precision: u8) -> Result<(), ArrowError> {
1099
0
    if precision > DECIMAL128_MAX_PRECISION {
1100
0
        return Err(ArrowError::InvalidArgumentError(format!(
1101
0
            "Max precision of a Decimal128 is {DECIMAL128_MAX_PRECISION}, but got {precision}",
1102
0
        )));
1103
0
    }
1104
0
    if value > MAX_DECIMAL128_FOR_EACH_PRECISION[precision as usize] {
1105
0
        Err(ArrowError::InvalidArgumentError(format!(
1106
0
            "{value} is too large to store in a Decimal128 of precision {precision}. Max is {}",
1107
0
            MAX_DECIMAL128_FOR_EACH_PRECISION[precision as usize]
1108
0
        )))
1109
0
    } else if value < MIN_DECIMAL128_FOR_EACH_PRECISION[precision as usize] {
1110
0
        Err(ArrowError::InvalidArgumentError(format!(
1111
0
            "{value} is too small to store in a Decimal128 of precision {precision}. Min is {}",
1112
0
            MIN_DECIMAL128_FOR_EACH_PRECISION[precision as usize]
1113
0
        )))
1114
    } else {
1115
0
        Ok(())
1116
    }
1117
0
}
1118
1119
/// Returns true if the specified `i128` value can be properly
1120
/// interpreted as a [`Decimal128`] number with precision `precision`
1121
///
1122
/// [`Decimal128`]: arrow_schema::DataType::Decimal128
1123
#[inline]
1124
0
pub fn is_validate_decimal_precision(value: i128, precision: u8) -> bool {
1125
0
    precision <= DECIMAL128_MAX_PRECISION
1126
0
        && value >= MIN_DECIMAL128_FOR_EACH_PRECISION[precision as usize]
1127
0
        && value <= MAX_DECIMAL128_FOR_EACH_PRECISION[precision as usize]
1128
0
}
1129
1130
/// Validates that the specified `i256` of value can be properly
1131
/// interpreted as a [`Decimal256`] number with precision `precision`
1132
///
1133
/// [`Decimal256`]: arrow_schema::DataType::Decimal256
1134
#[inline]
1135
0
pub fn validate_decimal256_precision(value: i256, precision: u8) -> Result<(), ArrowError> {
1136
0
    if precision > DECIMAL256_MAX_PRECISION {
1137
0
        return Err(ArrowError::InvalidArgumentError(format!(
1138
0
            "Max precision of a Decimal256 is {DECIMAL256_MAX_PRECISION}, but got {precision}",
1139
0
        )));
1140
0
    }
1141
0
    if value > MAX_DECIMAL256_FOR_EACH_PRECISION[precision as usize] {
1142
0
        Err(ArrowError::InvalidArgumentError(format!(
1143
0
            "{value:?} is too large to store in a Decimal256 of precision {precision}. Max is {:?}",
1144
0
            MAX_DECIMAL256_FOR_EACH_PRECISION[precision as usize]
1145
0
        )))
1146
0
    } else if value < MIN_DECIMAL256_FOR_EACH_PRECISION[precision as usize] {
1147
0
        Err(ArrowError::InvalidArgumentError(format!(
1148
0
            "{value:?} is too small to store in a Decimal256 of precision {precision}. Min is {:?}",
1149
0
            MIN_DECIMAL256_FOR_EACH_PRECISION[precision as usize]
1150
0
        )))
1151
    } else {
1152
0
        Ok(())
1153
    }
1154
0
}
1155
1156
/// Return true if the specified `i256` value can be properly
1157
/// interpreted as a [`Decimal256`] number with precision `precision`
1158
///
1159
/// [`Decimal256`]: arrow_schema::DataType::Decimal256
1160
#[inline]
1161
0
pub fn is_validate_decimal256_precision(value: i256, precision: u8) -> bool {
1162
0
    precision <= DECIMAL256_MAX_PRECISION
1163
0
        && value >= MIN_DECIMAL256_FOR_EACH_PRECISION[precision as usize]
1164
0
        && value <= MAX_DECIMAL256_FOR_EACH_PRECISION[precision as usize]
1165
0
}