arrow_data/
decimal.rs

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`] and [`Decimal128`].
19//!
20//! Also provides functions to validate if a given decimal value is within
21//! the valid range of the decimal type.
22//!
23//! [`Decimal128`]: arrow_schema::DataType::Decimal128
24//! [`Decimal256`]: arrow_schema::DataType::Decimal256
25use arrow_buffer::i256;
26use arrow_schema::ArrowError;
27
28pub use arrow_schema::{
29    DECIMAL128_MAX_PRECISION, DECIMAL128_MAX_SCALE, DECIMAL256_MAX_PRECISION, DECIMAL256_MAX_SCALE,
30    DECIMAL_DEFAULT_SCALE,
31};
32
33/// `MAX_DECIMAL256_FOR_EACH_PRECISION[p]` holds the maximum [`i256`] value that can
34/// be stored in a [`Decimal256`] value of precision `p`.
35///
36/// # Notes
37///
38/// Each element is the max value of signed 256-bit integer for the specified
39/// precision which is encoded to the 32-byte width format of little-endian.
40///
41/// The first element is unused and is inserted so that we can look up using
42/// precision as the index without the need to subtract 1 first.
43///
44/// # Example
45/// ```
46/// # use arrow_buffer::i256;
47/// # use arrow_data::decimal::MAX_DECIMAL256_FOR_EACH_PRECISION;
48/// assert_eq!(MAX_DECIMAL256_FOR_EACH_PRECISION[3], i256::from(999));
49/// ```
50///
51/// [`Decimal256`]: arrow_schema::DataType::Decimal256
52/// [`i256`]: arrow_buffer::i256
53pub const MAX_DECIMAL256_FOR_EACH_PRECISION: [i256; 77] = [
54    i256::from_i128(0_i128), // unused first element
55    i256::from_le_bytes([
56        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,
57        0, 0,
58    ]),
59    i256::from_le_bytes([
60        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,
61        0, 0,
62    ]),
63    i256::from_le_bytes([
64        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,
65        0, 0,
66    ]),
67    i256::from_le_bytes([
68        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,
69        0, 0,
70    ]),
71    i256::from_le_bytes([
72        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,
73        0, 0, 0,
74    ]),
75    i256::from_le_bytes([
76        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,
77        0, 0, 0,
78    ]),
79    i256::from_le_bytes([
80        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,
81        0, 0, 0, 0,
82    ]),
83    i256::from_le_bytes([
84        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,
85        0, 0, 0, 0,
86    ]),
87    i256::from_le_bytes([
88        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,
89        0, 0, 0, 0,
90    ]),
91    i256::from_le_bytes([
92        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,
93        0, 0, 0, 0,
94    ]),
95    i256::from_le_bytes([
96        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,
97        0, 0, 0, 0,
98    ]),
99    i256::from_le_bytes([
100        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,
101        0, 0, 0, 0, 0,
102    ]),
103    i256::from_le_bytes([
104        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,
105        0, 0, 0, 0,
106    ]),
107    i256::from_le_bytes([
108        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,
109        0, 0, 0, 0, 0,
110    ]),
111    i256::from_le_bytes([
112        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,
113        0, 0, 0, 0, 0, 0,
114    ]),
115    i256::from_le_bytes([
116        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,
117        0, 0, 0, 0, 0, 0,
118    ]),
119    i256::from_le_bytes([
120        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,
121        0, 0, 0, 0, 0,
122    ]),
123    i256::from_le_bytes([
124        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,
125        0, 0, 0, 0, 0, 0,
126    ]),
127    i256::from_le_bytes([
128        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,
129        0, 0, 0, 0, 0, 0,
130    ]),
131    i256::from_le_bytes([
132        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,
133        0, 0, 0, 0, 0, 0,
134    ]),
135    i256::from_le_bytes([
136        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,
137        0, 0, 0, 0, 0, 0, 0,
138    ]),
139    i256::from_le_bytes([
140        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,
141        0, 0, 0, 0, 0, 0, 0,
142    ]),
143    i256::from_le_bytes([
144        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,
145        0, 0, 0, 0, 0, 0, 0,
146    ]),
147    i256::from_le_bytes([
148        255, 255, 255, 160, 237, 204, 206, 27, 194, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
149        0, 0, 0, 0, 0, 0, 0, 0,
150    ]),
151    i256::from_le_bytes([
152        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,
153        0, 0, 0, 0, 0, 0,
154    ]),
155    i256::from_le_bytes([
156        255, 255, 255, 227, 210, 12, 200, 220, 210, 183, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
157        0, 0, 0, 0, 0, 0, 0, 0,
158    ]),
159    i256::from_le_bytes([
160        255, 255, 255, 231, 60, 128, 208, 159, 60, 46, 59, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
161        0, 0, 0, 0, 0, 0, 0, 0,
162    ]),
163    i256::from_le_bytes([
164        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,
165        0, 0, 0, 0, 0, 0, 0,
166    ]),
167    i256::from_le_bytes([
168        255, 255, 255, 159, 202, 23, 114, 109, 174, 15, 30, 67, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
169        0, 0, 0, 0, 0, 0, 0, 0,
170    ]),
171    i256::from_le_bytes([
172        255, 255, 255, 63, 234, 237, 116, 70, 208, 156, 44, 159, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
173        0, 0, 0, 0, 0, 0, 0, 0, 0,
174    ]),
175    i256::from_le_bytes([
176        255, 255, 255, 127, 38, 75, 145, 192, 34, 32, 190, 55, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
177        0, 0, 0, 0, 0, 0, 0, 0, 0,
178    ]),
179    i256::from_le_bytes([
180        255, 255, 255, 255, 128, 239, 172, 133, 91, 65, 109, 45, 238, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
181        0, 0, 0, 0, 0, 0, 0, 0, 0,
182    ]),
183    i256::from_le_bytes([
184        255, 255, 255, 255, 9, 91, 193, 56, 147, 141, 68, 198, 77, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0,
185        0, 0, 0, 0, 0, 0, 0, 0, 0,
186    ]),
187    i256::from_le_bytes([
188        255, 255, 255, 255, 99, 142, 141, 55, 192, 135, 173, 190, 9, 237, 1, 0, 0, 0, 0, 0, 0, 0,
189        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
190    ]),
191    i256::from_le_bytes([
192        255, 255, 255, 255, 231, 143, 135, 43, 130, 77, 199, 114, 97, 66, 19, 0, 0, 0, 0, 0, 0, 0,
193        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
194    ]),
195    i256::from_le_bytes([
196        255, 255, 255, 255, 15, 159, 75, 179, 21, 7, 201, 123, 206, 151, 192, 0, 0, 0, 0, 0, 0, 0,
197        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
198    ]),
199    i256::from_le_bytes([
200        255, 255, 255, 255, 159, 54, 244, 0, 217, 70, 218, 213, 16, 238, 133, 7, 0, 0, 0, 0, 0, 0,
201        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
202    ]),
203    i256::from_le_bytes([
204        255, 255, 255, 255, 63, 34, 138, 9, 122, 196, 134, 90, 168, 76, 59, 75, 0, 0, 0, 0, 0, 0,
205        0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
206    ]),
207    i256::from_le_bytes([
208        255, 255, 255, 255, 127, 86, 101, 95, 196, 172, 67, 137, 147, 254, 80, 240, 2, 0, 0, 0, 0,
209        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
210    ]),
211    i256::from_le_bytes([
212        255, 255, 255, 255, 255, 96, 245, 185, 171, 191, 164, 92, 195, 241, 41, 99, 29, 0, 0, 0, 0,
213        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
214    ]),
215    i256::from_le_bytes([
216        255, 255, 255, 255, 255, 201, 149, 67, 181, 124, 111, 158, 161, 113, 163, 223, 37, 1, 0, 0,
217        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
218    ]),
219    i256::from_le_bytes([
220        255, 255, 255, 255, 255, 227, 217, 163, 20, 223, 90, 48, 80, 112, 98, 188, 122, 11, 0, 0,
221        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
222    ]),
223    i256::from_le_bytes([
224        255, 255, 255, 255, 255, 231, 130, 102, 206, 182, 140, 227, 33, 99, 216, 91, 203, 114, 0,
225        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
226    ]),
227    i256::from_le_bytes([
228        255, 255, 255, 255, 255, 15, 29, 1, 16, 36, 127, 227, 82, 223, 115, 150, 241, 123, 4, 0, 0,
229        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
230    ]),
231    i256::from_le_bytes([
232        255, 255, 255, 255, 255, 159, 34, 11, 160, 104, 247, 226, 60, 185, 134, 224, 111, 215, 44,
233        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
234    ]),
235    i256::from_le_bytes([
236        255, 255, 255, 255, 255, 63, 90, 111, 64, 22, 170, 221, 96, 60, 67, 197, 94, 106, 192, 1,
237        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
238    ]),
239    i256::from_le_bytes([
240        255, 255, 255, 255, 255, 127, 134, 89, 132, 222, 164, 168, 200, 91, 160, 180, 179, 39, 132,
241        17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
242    ]),
243    i256::from_le_bytes([
244        255, 255, 255, 255, 255, 255, 64, 127, 43, 177, 112, 150, 214, 149, 67, 14, 5, 141, 41,
245        175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
246    ]),
247    i256::from_le_bytes([
248        255, 255, 255, 255, 255, 255, 137, 248, 178, 235, 102, 224, 97, 218, 163, 142, 50, 130,
249        159, 215, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
250    ]),
251    i256::from_le_bytes([
252        255, 255, 255, 255, 255, 255, 99, 181, 253, 52, 5, 196, 210, 135, 102, 146, 249, 21, 59,
253        108, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
254    ]),
255    i256::from_le_bytes([
256        255, 255, 255, 255, 255, 255, 231, 21, 233, 17, 52, 168, 59, 78, 1, 184, 191, 219, 78, 58,
257        172, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
258    ]),
259    i256::from_le_bytes([
260        255, 255, 255, 255, 255, 255, 15, 219, 26, 179, 8, 146, 84, 14, 13, 48, 125, 149, 20, 71,
261        186, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
262    ]),
263    i256::from_le_bytes([
264        255, 255, 255, 255, 255, 255, 159, 142, 12, 255, 86, 180, 77, 143, 130, 224, 227, 214, 205,
265        198, 70, 11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
266    ]),
267    i256::from_le_bytes([
268        255, 255, 255, 255, 255, 255, 63, 146, 125, 246, 101, 11, 9, 153, 25, 197, 230, 100, 10,
269        196, 195, 112, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,
270    ]),
271    i256::from_le_bytes([
272        255, 255, 255, 255, 255, 255, 127, 182, 231, 160, 251, 113, 90, 250, 255, 178, 3, 241, 103,
273        168, 165, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0,
274    ]),
275    i256::from_le_bytes([
276        255, 255, 255, 255, 255, 255, 255, 32, 13, 73, 212, 115, 136, 199, 255, 253, 36, 106, 15,
277        148, 120, 12, 20, 4, 0, 0, 0, 0, 0, 0, 0, 0,
278    ]),
279    i256::from_le_bytes([
280        255, 255, 255, 255, 255, 255, 255, 73, 131, 218, 74, 134, 84, 203, 253, 235, 113, 37, 154,
281        200, 181, 124, 200, 40, 0, 0, 0, 0, 0, 0, 0, 0,
282    ]),
283    i256::from_le_bytes([
284        255, 255, 255, 255, 255, 255, 255, 227, 32, 137, 236, 62, 77, 241, 233, 55, 115, 118, 5,
285        214, 25, 223, 212, 151, 1, 0, 0, 0, 0, 0, 0, 0,
286    ]),
287    i256::from_le_bytes([
288        255, 255, 255, 255, 255, 255, 255, 231, 72, 91, 61, 117, 4, 109, 35, 47, 128, 160, 54, 92,
289        2, 183, 80, 238, 15, 0, 0, 0, 0, 0, 0, 0,
290    ]),
291    i256::from_le_bytes([
292        255, 255, 255, 255, 255, 255, 255, 15, 217, 144, 101, 148, 44, 66, 98, 215, 1, 69, 34, 154,
293        23, 38, 39, 79, 159, 0, 0, 0, 0, 0, 0, 0,
294    ]),
295    i256::from_le_bytes([
296        255, 255, 255, 255, 255, 255, 255, 159, 122, 168, 247, 203, 189, 149, 214, 105, 18, 178,
297        86, 5, 236, 124, 135, 23, 57, 6, 0, 0, 0, 0, 0, 0,
298    ]),
299    i256::from_le_bytes([
300        255, 255, 255, 255, 255, 255, 255, 63, 202, 148, 172, 247, 105, 217, 97, 34, 184, 244, 98,
301        53, 56, 225, 74, 235, 58, 62, 0, 0, 0, 0, 0, 0,
302    ]),
303    i256::from_le_bytes([
304        255, 255, 255, 255, 255, 255, 255, 127, 230, 207, 189, 172, 35, 126, 210, 87, 49, 143, 221,
305        21, 50, 204, 236, 48, 77, 110, 2, 0, 0, 0, 0, 0,
306    ]),
307    i256::from_le_bytes([
308        255, 255, 255, 255, 255, 255, 255, 255, 0, 31, 106, 191, 100, 237, 56, 110, 237, 151, 167,
309        218, 244, 249, 63, 233, 3, 79, 24, 0, 0, 0, 0, 0,
310    ]),
311    i256::from_le_bytes([
312        255, 255, 255, 255, 255, 255, 255, 255, 9, 54, 37, 122, 239, 69, 57, 78, 70, 239, 139, 138,
313        144, 195, 127, 28, 39, 22, 243, 0, 0, 0, 0, 0,
314    ]),
315    i256::from_le_bytes([
316        255, 255, 255, 255, 255, 255, 255, 255, 99, 28, 116, 197, 90, 187, 60, 14, 191, 88, 119,
317        105, 165, 163, 253, 28, 135, 221, 126, 9, 0, 0, 0, 0,
318    ]),
319    i256::from_le_bytes([
320        255, 255, 255, 255, 255, 255, 255, 255, 231, 27, 137, 182, 139, 81, 95, 142, 118, 119, 169,
321        30, 118, 100, 232, 33, 71, 167, 244, 94, 0, 0, 0, 0,
322    ]),
323    i256::from_le_bytes([
324        255, 255, 255, 255, 255, 255, 255, 255, 15, 23, 91, 33, 117, 47, 185, 143, 161, 170, 158,
325        50, 157, 236, 19, 83, 199, 136, 142, 181, 3, 0, 0, 0,
326    ]),
327    i256::from_le_bytes([
328        255, 255, 255, 255, 255, 255, 255, 255, 159, 230, 142, 77, 147, 218, 59, 157, 79, 170, 50,
329        250, 35, 62, 199, 62, 201, 87, 145, 23, 37, 0, 0, 0,
330    ]),
331    i256::from_le_bytes([
332        255, 255, 255, 255, 255, 255, 255, 255, 63, 2, 149, 7, 193, 137, 86, 36, 28, 167, 250, 197,
333        103, 109, 200, 115, 220, 109, 173, 235, 114, 1, 0, 0,
334    ]),
335    i256::from_le_bytes([
336        255, 255, 255, 255, 255, 255, 255, 255, 127, 22, 210, 75, 138, 97, 97, 107, 25, 135, 202,
337        187, 13, 70, 212, 133, 156, 74, 198, 52, 125, 14, 0, 0,
338    ]),
339    i256::from_le_bytes([
340        255, 255, 255, 255, 255, 255, 255, 255, 255, 224, 52, 246, 102, 207, 205, 49, 254, 70, 233,
341        85, 137, 188, 74, 58, 29, 234, 190, 15, 228, 144, 0, 0,
342    ]),
343    i256::from_le_bytes([
344        255, 255, 255, 255, 255, 255, 255, 255, 255, 201, 16, 158, 5, 26, 10, 242, 237, 197, 28,
345        91, 93, 93, 235, 70, 36, 37, 117, 157, 232, 168, 5, 0,
346    ]),
347    i256::from_le_bytes([
348        255, 255, 255, 255, 255, 255, 255, 255, 255, 227, 167, 44, 56, 4, 101, 116, 75, 187, 31,
349        143, 165, 165, 49, 197, 106, 115, 147, 38, 22, 153, 56, 0,
350    ]),
351    i256::from_le_bytes([
352        255, 255, 255, 255, 255, 255, 255, 255, 255, 231, 142, 190, 49, 42, 242, 139, 242, 80, 61,
353        151, 119, 120, 240, 179, 43, 130, 194, 129, 221, 250, 53, 2,
354    ]),
355    i256::from_le_bytes([
356        255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 149, 113, 241, 165, 117, 119, 121, 41,
357        101, 232, 171, 180, 100, 7, 181, 21, 153, 17, 167, 204, 27, 22,
358    ]),
359];
360
361/// `MIN_DECIMAL256_FOR_EACH_PRECISION[p]` holds the minimum [`i256`] value that can
362/// be stored in a [`Decimal256`] value of precision `p`.
363///
364/// # Notes
365///
366/// Each element is the min value of signed 256-bit integer for the specified precision which
367/// is encoded to the 76-byte width format of little-endian.
368///
369/// The first element is unused and is inserted so that we can look up using
370/// precision as the index without the need to subtract 1 first.
371/// # Example
372/// ```
373/// # use arrow_buffer::i256;
374/// # use arrow_data::decimal::MIN_DECIMAL256_FOR_EACH_PRECISION;
375/// assert_eq!(MIN_DECIMAL256_FOR_EACH_PRECISION[3], i256::from(-999));
376/// ```
377///
378/// [`i256`]: arrow_buffer::i256
379/// [`Decimal256`]: arrow_schema::DataType::Decimal256
380pub const MIN_DECIMAL256_FOR_EACH_PRECISION: [i256; 77] = [
381    i256::from_i128(0_i128), // unused first element
382    i256::from_le_bytes([
383        247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
384        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
385    ]),
386    i256::from_le_bytes([
387        157, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
388        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
389    ]),
390    i256::from_le_bytes([
391        25, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
392        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
393    ]),
394    i256::from_le_bytes([
395        241, 216, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
396        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
397    ]),
398    i256::from_le_bytes([
399        97, 121, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
400        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
401    ]),
402    i256::from_le_bytes([
403        193, 189, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
404        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
405    ]),
406    i256::from_le_bytes([
407        129, 105, 103, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
408        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
409    ]),
410    i256::from_le_bytes([
411        1, 31, 10, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
412        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
413    ]),
414    i256::from_le_bytes([
415        1, 54, 101, 196, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
416        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
417    ]),
418    i256::from_le_bytes([
419        1, 28, 244, 171, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
420        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
421    ]),
422    i256::from_le_bytes([
423        1, 24, 137, 183, 232, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
424        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
425    ]),
426    i256::from_le_bytes([
427        1, 240, 90, 43, 23, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
428        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
429    ]),
430    i256::from_le_bytes([
431        1, 96, 141, 177, 231, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
432        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
433    ]),
434    i256::from_le_bytes([
435        1, 192, 133, 239, 12, 165, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
436        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
437    ]),
438    i256::from_le_bytes([
439        1, 128, 57, 91, 129, 114, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
440        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
441    ]),
442    i256::from_le_bytes([
443        1, 0, 63, 144, 13, 121, 220, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
444        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
445    ]),
446    i256::from_le_bytes([
447        1, 0, 118, 162, 135, 186, 156, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
448        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
449    ]),
450    i256::from_le_bytes([
451        1, 0, 156, 88, 76, 73, 31, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
452        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
453    ]),
454    i256::from_le_bytes([
455        1, 0, 24, 118, 251, 220, 56, 117, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
456        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
457    ]),
458    i256::from_le_bytes([
459        1, 0, 240, 156, 210, 161, 56, 148, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
460        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
461    ]),
462    i256::from_le_bytes([
463        1, 0, 96, 33, 58, 82, 54, 202, 201, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
464        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
465    ]),
466    i256::from_le_bytes([
467        1, 0, 192, 77, 69, 54, 31, 230, 225, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
468        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
469    ]),
470    i256::from_le_bytes([
471        1, 0, 128, 9, 181, 30, 56, 253, 210, 234, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
472        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
473    ]),
474    i256::from_le_bytes([
475        1, 0, 0, 95, 18, 51, 49, 228, 61, 44, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
476        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
477    ]),
478    i256::from_le_bytes([
479        1, 0, 0, 182, 183, 254, 235, 233, 106, 186, 247, 255, 255, 255, 255, 255, 255, 255, 255,
480        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
481    ]),
482    i256::from_le_bytes([
483        1, 0, 0, 28, 45, 243, 55, 35, 45, 72, 173, 255, 255, 255, 255, 255, 255, 255, 255, 255,
484        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
485    ]),
486    i256::from_le_bytes([
487        1, 0, 0, 24, 195, 127, 47, 96, 195, 209, 196, 252, 255, 255, 255, 255, 255, 255, 255, 255,
488        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
489    ]),
490    i256::from_le_bytes([
491        1, 0, 0, 240, 158, 253, 218, 193, 161, 49, 176, 223, 255, 255, 255, 255, 255, 255, 255,
492        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
493    ]),
494    i256::from_le_bytes([
495        1, 0, 0, 96, 53, 232, 141, 146, 81, 240, 225, 188, 254, 255, 255, 255, 255, 255, 255, 255,
496        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
497    ]),
498    i256::from_le_bytes([
499        1, 0, 0, 192, 21, 18, 139, 185, 47, 99, 211, 96, 243, 255, 255, 255, 255, 255, 255, 255,
500        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
501    ]),
502    i256::from_le_bytes([
503        1, 0, 0, 128, 217, 180, 110, 63, 221, 223, 65, 200, 129, 255, 255, 255, 255, 255, 255, 255,
504        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
505    ]),
506    i256::from_le_bytes([
507        1, 0, 0, 0, 127, 16, 83, 122, 164, 190, 146, 210, 17, 251, 255, 255, 255, 255, 255, 255,
508        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
509    ]),
510    i256::from_le_bytes([
511        1, 0, 0, 0, 246, 164, 62, 199, 108, 114, 187, 57, 178, 206, 255, 255, 255, 255, 255, 255,
512        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
513    ]),
514    i256::from_le_bytes([
515        1, 0, 0, 0, 156, 113, 114, 200, 63, 120, 82, 65, 246, 18, 254, 255, 255, 255, 255, 255,
516        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
517    ]),
518    i256::from_le_bytes([
519        1, 0, 0, 0, 24, 112, 120, 212, 125, 178, 56, 141, 158, 189, 236, 255, 255, 255, 255, 255,
520        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
521    ]),
522    i256::from_le_bytes([
523        1, 0, 0, 0, 240, 96, 180, 76, 234, 248, 54, 132, 49, 104, 63, 255, 255, 255, 255, 255, 255,
524        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
525    ]),
526    i256::from_le_bytes([
527        1, 0, 0, 0, 96, 201, 11, 255, 38, 185, 37, 42, 239, 17, 122, 248, 255, 255, 255, 255, 255,
528        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
529    ]),
530    i256::from_le_bytes([
531        1, 0, 0, 0, 192, 221, 117, 246, 133, 59, 121, 165, 87, 179, 196, 180, 255, 255, 255, 255,
532        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
533    ]),
534    i256::from_le_bytes([
535        1, 0, 0, 0, 128, 169, 154, 160, 59, 83, 188, 118, 108, 1, 175, 15, 253, 255, 255, 255, 255,
536        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
537    ]),
538    i256::from_le_bytes([
539        1, 0, 0, 0, 0, 159, 10, 70, 84, 64, 91, 163, 60, 14, 214, 156, 226, 255, 255, 255, 255,
540        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
541    ]),
542    i256::from_le_bytes([
543        1, 0, 0, 0, 0, 54, 106, 188, 74, 131, 144, 97, 94, 142, 92, 32, 218, 254, 255, 255, 255,
544        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
545    ]),
546    i256::from_le_bytes([
547        1, 0, 0, 0, 0, 28, 38, 92, 235, 32, 165, 207, 175, 143, 157, 67, 133, 244, 255, 255, 255,
548        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
549    ]),
550    i256::from_le_bytes([
551        1, 0, 0, 0, 0, 24, 125, 153, 49, 73, 115, 28, 222, 156, 39, 164, 52, 141, 255, 255, 255,
552        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
553    ]),
554    i256::from_le_bytes([
555        1, 0, 0, 0, 0, 240, 226, 254, 239, 219, 128, 28, 173, 32, 140, 105, 14, 132, 251, 255, 255,
556        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
557    ]),
558    i256::from_le_bytes([
559        1, 0, 0, 0, 0, 96, 221, 244, 95, 151, 8, 29, 195, 70, 121, 31, 144, 40, 211, 255, 255, 255,
560        255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
561    ]),
562    i256::from_le_bytes([
563        1, 0, 0, 0, 0, 192, 165, 144, 191, 233, 85, 34, 159, 195, 188, 58, 161, 149, 63, 254, 255,
564        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
565    ]),
566    i256::from_le_bytes([
567        1, 0, 0, 0, 0, 128, 121, 166, 123, 33, 91, 87, 55, 164, 95, 75, 76, 216, 123, 238, 255,
568        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
569    ]),
570    i256::from_le_bytes([
571        1, 0, 0, 0, 0, 0, 191, 128, 212, 78, 143, 105, 41, 106, 188, 241, 250, 114, 214, 80, 255,
572        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
573    ]),
574    i256::from_le_bytes([
575        1, 0, 0, 0, 0, 0, 118, 7, 77, 20, 153, 31, 158, 37, 92, 113, 205, 125, 96, 40, 249, 255,
576        255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
577    ]),
578    i256::from_le_bytes([
579        1, 0, 0, 0, 0, 0, 156, 74, 2, 203, 250, 59, 45, 120, 153, 109, 6, 234, 196, 147, 187, 255,
580        255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
581    ]),
582    i256::from_le_bytes([
583        1, 0, 0, 0, 0, 0, 24, 234, 22, 238, 203, 87, 196, 177, 254, 71, 64, 36, 177, 197, 83, 253,
584        255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
585    ]),
586    i256::from_le_bytes([
587        1, 0, 0, 0, 0, 0, 240, 36, 229, 76, 247, 109, 171, 241, 242, 207, 130, 106, 235, 184, 69,
588        229, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
589    ]),
590    i256::from_le_bytes([
591        1, 0, 0, 0, 0, 0, 96, 113, 243, 0, 169, 75, 178, 112, 125, 31, 28, 41, 50, 57, 185, 244,
592        254, 255, 255, 255, 255, 255, 255, 255, 255, 255,
593    ]),
594    i256::from_le_bytes([
595        1, 0, 0, 0, 0, 0, 192, 109, 130, 9, 154, 244, 246, 102, 230, 58, 25, 155, 245, 59, 60, 143,
596        245, 255, 255, 255, 255, 255, 255, 255, 255, 255,
597    ]),
598    i256::from_le_bytes([
599        1, 0, 0, 0, 0, 0, 128, 73, 24, 95, 4, 142, 165, 5, 0, 77, 252, 14, 152, 87, 90, 152, 151,
600        255, 255, 255, 255, 255, 255, 255, 255, 255,
601    ]),
602    i256::from_le_bytes([
603        1, 0, 0, 0, 0, 0, 0, 223, 242, 182, 43, 140, 119, 56, 0, 2, 219, 149, 240, 107, 135, 243,
604        235, 251, 255, 255, 255, 255, 255, 255, 255, 255,
605    ]),
606    i256::from_le_bytes([
607        1, 0, 0, 0, 0, 0, 0, 182, 124, 37, 181, 121, 171, 52, 2, 20, 142, 218, 101, 55, 74, 131,
608        55, 215, 255, 255, 255, 255, 255, 255, 255, 255,
609    ]),
610    i256::from_le_bytes([
611        1, 0, 0, 0, 0, 0, 0, 28, 223, 118, 19, 193, 178, 14, 22, 200, 140, 137, 250, 41, 230, 32,
612        43, 104, 254, 255, 255, 255, 255, 255, 255, 255,
613    ]),
614    i256::from_le_bytes([
615        1, 0, 0, 0, 0, 0, 0, 24, 183, 164, 194, 138, 251, 146, 220, 208, 127, 95, 201, 163, 253,
616        72, 175, 17, 240, 255, 255, 255, 255, 255, 255, 255,
617    ]),
618    i256::from_le_bytes([
619        1, 0, 0, 0, 0, 0, 0, 240, 38, 111, 154, 107, 211, 189, 157, 40, 254, 186, 221, 101, 232,
620        217, 216, 176, 96, 255, 255, 255, 255, 255, 255, 255,
621    ]),
622    i256::from_le_bytes([
623        1, 0, 0, 0, 0, 0, 0, 96, 133, 87, 8, 52, 66, 106, 41, 150, 237, 77, 169, 250, 19, 131, 120,
624        232, 198, 249, 255, 255, 255, 255, 255, 255,
625    ]),
626    i256::from_le_bytes([
627        1, 0, 0, 0, 0, 0, 0, 192, 53, 107, 83, 8, 150, 38, 158, 221, 71, 11, 157, 202, 199, 30,
628        181, 20, 197, 193, 255, 255, 255, 255, 255, 255,
629    ]),
630    i256::from_le_bytes([
631        1, 0, 0, 0, 0, 0, 0, 128, 25, 48, 66, 83, 220, 129, 45, 168, 206, 112, 34, 234, 205, 51,
632        19, 207, 178, 145, 253, 255, 255, 255, 255, 255,
633    ]),
634    i256::from_le_bytes([
635        1, 0, 0, 0, 0, 0, 0, 0, 255, 224, 149, 64, 155, 18, 199, 145, 18, 104, 88, 37, 11, 6, 192,
636        22, 252, 176, 231, 255, 255, 255, 255, 255,
637    ]),
638    i256::from_le_bytes([
639        1, 0, 0, 0, 0, 0, 0, 0, 246, 201, 218, 133, 16, 186, 198, 177, 185, 16, 116, 117, 111, 60,
640        128, 227, 216, 233, 12, 255, 255, 255, 255, 255,
641    ]),
642    i256::from_le_bytes([
643        1, 0, 0, 0, 0, 0, 0, 0, 156, 227, 139, 58, 165, 68, 195, 241, 64, 167, 136, 150, 90, 92, 2,
644        227, 120, 34, 129, 246, 255, 255, 255, 255,
645    ]),
646    i256::from_le_bytes([
647        1, 0, 0, 0, 0, 0, 0, 0, 24, 228, 118, 73, 116, 174, 160, 113, 137, 136, 86, 225, 137, 155,
648        23, 222, 184, 88, 11, 161, 255, 255, 255, 255,
649    ]),
650    i256::from_le_bytes([
651        1, 0, 0, 0, 0, 0, 0, 0, 240, 232, 164, 222, 138, 208, 70, 112, 94, 85, 97, 205, 98, 19,
652        236, 172, 56, 119, 113, 74, 252, 255, 255, 255,
653    ]),
654    i256::from_le_bytes([
655        1, 0, 0, 0, 0, 0, 0, 0, 96, 25, 113, 178, 108, 37, 196, 98, 176, 85, 205, 5, 220, 193, 56,
656        193, 54, 168, 110, 232, 218, 255, 255, 255,
657    ]),
658    i256::from_le_bytes([
659        1, 0, 0, 0, 0, 0, 0, 0, 192, 253, 106, 248, 62, 118, 169, 219, 227, 88, 5, 58, 152, 146,
660        55, 140, 35, 146, 82, 20, 141, 254, 255, 255,
661    ]),
662    i256::from_le_bytes([
663        1, 0, 0, 0, 0, 0, 0, 0, 128, 233, 45, 180, 117, 158, 158, 148, 230, 120, 53, 68, 242, 185,
664        43, 122, 99, 181, 57, 203, 130, 241, 255, 255,
665    ]),
666    i256::from_le_bytes([
667        1, 0, 0, 0, 0, 0, 0, 0, 0, 31, 203, 9, 153, 48, 50, 206, 1, 185, 22, 170, 118, 67, 181,
668        197, 226, 21, 65, 240, 27, 111, 255, 255,
669    ]),
670    i256::from_le_bytes([
671        1, 0, 0, 0, 0, 0, 0, 0, 0, 54, 239, 97, 250, 229, 245, 13, 18, 58, 227, 164, 162, 162, 20,
672        185, 219, 218, 138, 98, 23, 87, 250, 255,
673    ]),
674    i256::from_le_bytes([
675        1, 0, 0, 0, 0, 0, 0, 0, 0, 28, 88, 211, 199, 251, 154, 139, 180, 68, 224, 112, 90, 90, 206,
676        58, 149, 140, 108, 217, 233, 102, 199, 255,
677    ]),
678    i256::from_le_bytes([
679        1, 0, 0, 0, 0, 0, 0, 0, 0, 24, 113, 65, 206, 213, 13, 116, 13, 175, 194, 104, 136, 135, 15,
680        76, 212, 125, 61, 126, 34, 5, 202, 253,
681    ]),
682    i256::from_le_bytes([
683        1, 0, 0, 0, 0, 0, 0, 0, 0, 240, 106, 142, 14, 90, 138, 136, 134, 214, 154, 23, 84, 75, 155,
684        248, 74, 234, 102, 238, 88, 51, 228, 233,
685    ]),
686];
687
688/// `MAX_DECIMAL_FOR_EACH_PRECISION[p-1]` holds the maximum `i128` value that can
689/// be stored in a [`Decimal128`] value of precision `p`
690///
691/// [`Decimal128`]: arrow_schema::DataType::Decimal128
692#[deprecated(
693    since = "54.1.0",
694    note = "Use MAX_DECIMAL128_FOR_EACH_PRECISION (note indexes are different)"
695)]
696#[allow(dead_code)] // no longer used but is part of our public API
697pub const MAX_DECIMAL_FOR_EACH_PRECISION: [i128; 38] = [
698    9,
699    99,
700    999,
701    9999,
702    99999,
703    999999,
704    9999999,
705    99999999,
706    999999999,
707    9999999999,
708    99999999999,
709    999999999999,
710    9999999999999,
711    99999999999999,
712    999999999999999,
713    9999999999999999,
714    99999999999999999,
715    999999999999999999,
716    9999999999999999999,
717    99999999999999999999,
718    999999999999999999999,
719    9999999999999999999999,
720    99999999999999999999999,
721    999999999999999999999999,
722    9999999999999999999999999,
723    99999999999999999999999999,
724    999999999999999999999999999,
725    9999999999999999999999999999,
726    99999999999999999999999999999,
727    999999999999999999999999999999,
728    9999999999999999999999999999999,
729    99999999999999999999999999999999,
730    999999999999999999999999999999999,
731    9999999999999999999999999999999999,
732    99999999999999999999999999999999999,
733    999999999999999999999999999999999999,
734    9999999999999999999999999999999999999,
735    99999999999999999999999999999999999999,
736];
737
738/// `MIN_DECIMAL_FOR_EACH_PRECISION[p-1]` holds the minimum `i128` value that can
739/// be stored in a [`Decimal128`] value of precision `p`
740///
741/// [`Decimal128`]: arrow_schema::DataType::Decimal128
742#[allow(dead_code)] // no longer used but is part of our public API
743#[deprecated(
744    since = "54.1.0",
745    note = "Use MIN_DECIMAL128_FOR_EACH_PRECISION (note indexes are different)"
746)]
747pub const MIN_DECIMAL_FOR_EACH_PRECISION: [i128; 38] = [
748    -9,
749    -99,
750    -999,
751    -9999,
752    -99999,
753    -999999,
754    -9999999,
755    -99999999,
756    -999999999,
757    -9999999999,
758    -99999999999,
759    -999999999999,
760    -9999999999999,
761    -99999999999999,
762    -999999999999999,
763    -9999999999999999,
764    -99999999999999999,
765    -999999999999999999,
766    -9999999999999999999,
767    -99999999999999999999,
768    -999999999999999999999,
769    -9999999999999999999999,
770    -99999999999999999999999,
771    -999999999999999999999999,
772    -9999999999999999999999999,
773    -99999999999999999999999999,
774    -999999999999999999999999999,
775    -9999999999999999999999999999,
776    -99999999999999999999999999999,
777    -999999999999999999999999999999,
778    -9999999999999999999999999999999,
779    -99999999999999999999999999999999,
780    -999999999999999999999999999999999,
781    -9999999999999999999999999999999999,
782    -99999999999999999999999999999999999,
783    -999999999999999999999999999999999999,
784    -9999999999999999999999999999999999999,
785    -99999999999999999999999999999999999999,
786];
787
788/// `MAX_DECIMAL128_FOR_EACH_PRECISION[p]` holds the maximum `i128` value that can
789/// be stored in [`Decimal128`] value of precision `p`.
790///
791/// # Notes
792///
793/// The first element is unused and is inserted so that we can look up using
794/// precision as the index without the need to subtract 1 first.
795///
796/// # Example
797/// ```
798/// # use arrow_data::decimal::MAX_DECIMAL128_FOR_EACH_PRECISION;
799/// assert_eq!(MAX_DECIMAL128_FOR_EACH_PRECISION[3], 999);
800/// ```
801///
802/// [`Decimal128`]: arrow_schema::DataType::Decimal128
803pub const MAX_DECIMAL128_FOR_EACH_PRECISION: [i128; 39] = [
804    0, // unused first element
805    9,
806    99,
807    999,
808    9999,
809    99999,
810    999999,
811    9999999,
812    99999999,
813    999999999,
814    9999999999,
815    99999999999,
816    999999999999,
817    9999999999999,
818    99999999999999,
819    999999999999999,
820    9999999999999999,
821    99999999999999999,
822    999999999999999999,
823    9999999999999999999,
824    99999999999999999999,
825    999999999999999999999,
826    9999999999999999999999,
827    99999999999999999999999,
828    999999999999999999999999,
829    9999999999999999999999999,
830    99999999999999999999999999,
831    999999999999999999999999999,
832    9999999999999999999999999999,
833    99999999999999999999999999999,
834    999999999999999999999999999999,
835    9999999999999999999999999999999,
836    99999999999999999999999999999999,
837    999999999999999999999999999999999,
838    9999999999999999999999999999999999,
839    99999999999999999999999999999999999,
840    999999999999999999999999999999999999,
841    9999999999999999999999999999999999999,
842    99999999999999999999999999999999999999,
843];
844
845/// `MIN_DECIMAL_FOR_EACH_PRECISION[p]` holds the minimum `i128` value that can
846/// be stored in a [`Decimal128`] value of precision `p`.
847///
848/// # Notes
849///
850/// The first element is unused and is inserted so that we can look up using
851/// precision as the index without the need to subtract 1 first.
852///
853/// # Example
854/// ```
855/// # use arrow_data::decimal::MIN_DECIMAL128_FOR_EACH_PRECISION;
856/// assert_eq!(MIN_DECIMAL128_FOR_EACH_PRECISION[3], -999);
857/// ```
858///
859/// [`Decimal128`]: arrow_schema::DataType::Decimal128
860pub const MIN_DECIMAL128_FOR_EACH_PRECISION: [i128; 39] = [
861    0, // unused first element
862    -9,
863    -99,
864    -999,
865    -9999,
866    -99999,
867    -999999,
868    -9999999,
869    -99999999,
870    -999999999,
871    -9999999999,
872    -99999999999,
873    -999999999999,
874    -9999999999999,
875    -99999999999999,
876    -999999999999999,
877    -9999999999999999,
878    -99999999999999999,
879    -999999999999999999,
880    -9999999999999999999,
881    -99999999999999999999,
882    -999999999999999999999,
883    -9999999999999999999999,
884    -99999999999999999999999,
885    -999999999999999999999999,
886    -9999999999999999999999999,
887    -99999999999999999999999999,
888    -999999999999999999999999999,
889    -9999999999999999999999999999,
890    -99999999999999999999999999999,
891    -999999999999999999999999999999,
892    -9999999999999999999999999999999,
893    -99999999999999999999999999999999,
894    -999999999999999999999999999999999,
895    -9999999999999999999999999999999999,
896    -99999999999999999999999999999999999,
897    -999999999999999999999999999999999999,
898    -9999999999999999999999999999999999999,
899    -99999999999999999999999999999999999999,
900];
901
902/// Validates that the specified `i128` value can be properly
903/// interpreted as a [`Decimal128`] number with precision `precision`
904///
905/// [`Decimal128`]: arrow_schema::DataType::Decimal128
906#[inline]
907pub fn validate_decimal_precision(value: i128, precision: u8) -> Result<(), ArrowError> {
908    if precision > DECIMAL128_MAX_PRECISION {
909        return Err(ArrowError::InvalidArgumentError(format!(
910            "Max precision of a Decimal128 is {DECIMAL128_MAX_PRECISION}, but got {precision}",
911        )));
912    }
913    if value > MAX_DECIMAL128_FOR_EACH_PRECISION[precision as usize] {
914        Err(ArrowError::InvalidArgumentError(format!(
915            "{value} is too large to store in a Decimal128 of precision {precision}. Max is {}",
916            MAX_DECIMAL128_FOR_EACH_PRECISION[precision as usize]
917        )))
918    } else if value < MIN_DECIMAL128_FOR_EACH_PRECISION[precision as usize] {
919        Err(ArrowError::InvalidArgumentError(format!(
920            "{value} is too small to store in a Decimal128 of precision {precision}. Min is {}",
921            MIN_DECIMAL128_FOR_EACH_PRECISION[precision as usize]
922        )))
923    } else {
924        Ok(())
925    }
926}
927
928/// Returns true if the specified `i128` value can be properly
929/// interpreted as a [`Decimal128`] number with precision `precision`
930///
931/// [`Decimal128`]: arrow_schema::DataType::Decimal128
932#[inline]
933pub fn is_validate_decimal_precision(value: i128, precision: u8) -> bool {
934    precision <= DECIMAL128_MAX_PRECISION
935        && value >= MIN_DECIMAL128_FOR_EACH_PRECISION[precision as usize]
936        && value <= MAX_DECIMAL128_FOR_EACH_PRECISION[precision as usize]
937}
938
939/// Validates that the specified `i256` of value can be properly
940/// interpreted as a [`Decimal256`] number with precision `precision`
941///
942/// [`Decimal256`]: arrow_schema::DataType::Decimal256
943#[inline]
944pub fn validate_decimal256_precision(value: i256, precision: u8) -> Result<(), ArrowError> {
945    if precision > DECIMAL256_MAX_PRECISION {
946        return Err(ArrowError::InvalidArgumentError(format!(
947            "Max precision of a Decimal256 is {DECIMAL256_MAX_PRECISION}, but got {precision}",
948        )));
949    }
950    if value > MAX_DECIMAL256_FOR_EACH_PRECISION[precision as usize] {
951        Err(ArrowError::InvalidArgumentError(format!(
952            "{value:?} is too large to store in a Decimal256 of precision {precision}. Max is {:?}",
953            MAX_DECIMAL256_FOR_EACH_PRECISION[precision as usize]
954        )))
955    } else if value < MIN_DECIMAL256_FOR_EACH_PRECISION[precision as usize] {
956        Err(ArrowError::InvalidArgumentError(format!(
957            "{value:?} is too small to store in a Decimal256 of precision {precision}. Min is {:?}",
958            MIN_DECIMAL256_FOR_EACH_PRECISION[precision as usize]
959        )))
960    } else {
961        Ok(())
962    }
963}
964
965/// Return true if the specified `i256` value can be properly
966/// interpreted as a [`Decimal256`] number with precision `precision`
967///
968/// [`Decimal256`]: arrow_schema::DataType::Decimal256
969#[inline]
970pub fn is_validate_decimal256_precision(value: i256, precision: u8) -> bool {
971    precision <= DECIMAL256_MAX_PRECISION
972        && value >= MIN_DECIMAL256_FOR_EACH_PRECISION[precision as usize]
973        && value <= MAX_DECIMAL256_FOR_EACH_PRECISION[precision as usize]
974}