1use std::collections::HashMap;
16use std::fmt::{Display, Formatter, Write};
17use std::hash::Hash;
18use std::io::BufRead;
19use std::io::Cursor;
20
21use arrow_buffer::i256;
22use chrono::{DateTime, Datelike, NaiveDate, NaiveDateTime};
23use geozero::wkb::FromWkb;
24use geozero::wkb::WkbDialect;
25use geozero::wkt::Ewkt;
26
27use crate::cursor_ext::{
28 collect_binary_number, collect_number, BufferReadStringExt, ReadBytesExt, ReadCheckPointExt,
29 ReadNumberExt,
30};
31use crate::error::{ConvertError, Error, Result};
32use crate::schema::{DataType, DecimalDataType, DecimalSize, NumberDataType};
33
34#[cfg(feature = "flight-sql")]
35use {
36 crate::schema::{
37 ARROW_EXT_TYPE_BITMAP, ARROW_EXT_TYPE_EMPTY_ARRAY, ARROW_EXT_TYPE_EMPTY_MAP,
38 ARROW_EXT_TYPE_GEOGRAPHY, ARROW_EXT_TYPE_GEOMETRY, ARROW_EXT_TYPE_INTERVAL,
39 ARROW_EXT_TYPE_VARIANT, ARROW_EXT_TYPE_VECTOR, EXTENSION_KEY,
40 },
41 arrow_array::{
42 Array as ArrowArray, BinaryArray, BooleanArray, Date32Array, Decimal128Array,
43 Decimal256Array, Float32Array, Float64Array, Int16Array, Int32Array, Int64Array, Int8Array,
44 LargeBinaryArray, LargeListArray, LargeStringArray, ListArray, MapArray, StringArray,
45 StringViewArray, StructArray, TimestampMicrosecondArray, UInt16Array, UInt32Array,
46 UInt64Array, UInt8Array,
47 },
48 arrow_schema::{DataType as ArrowDataType, Field as ArrowField, TimeUnit},
49 jsonb::RawJsonb,
50 std::sync::Arc,
51};
52
53const DAYS_FROM_CE: i32 = 719_163;
55const NULL_VALUE: &str = "NULL";
56const TRUE_VALUE: &str = "1";
57const FALSE_VALUE: &str = "0";
58const TIMESTAMP_FORMAT: &str = "%Y-%m-%d %H:%M:%S%.6f";
59
60#[derive(Clone, Debug, PartialEq)]
61pub enum NumberValue {
62 Int8(i8),
63 Int16(i16),
64 Int32(i32),
65 Int64(i64),
66 UInt8(u8),
67 UInt16(u16),
68 UInt32(u32),
69 UInt64(u64),
70 Float32(f32),
71 Float64(f64),
72 Decimal128(i128, DecimalSize),
73 Decimal256(i256, DecimalSize),
74}
75
76#[derive(Clone, Debug, PartialEq)]
77pub enum Value {
78 Null,
79 EmptyArray,
80 EmptyMap,
81 Boolean(bool),
82 Binary(Vec<u8>),
83 String(String),
84 Number(NumberValue),
85 Timestamp(i64),
87 Date(i32),
88 Array(Vec<Value>),
89 Map(Vec<(Value, Value)>),
90 Tuple(Vec<Value>),
91 Bitmap(String),
92 Variant(String),
93 Geometry(String),
94 Geography(String),
95 Interval(String),
96 Vector(Vec<f32>),
97}
98
99impl Value {
100 pub fn get_type(&self) -> DataType {
101 match self {
102 Self::Null => DataType::Null,
103 Self::EmptyArray => DataType::EmptyArray,
104 Self::EmptyMap => DataType::EmptyMap,
105 Self::Boolean(_) => DataType::Boolean,
106 Self::Binary(_) => DataType::Binary,
107 Self::String(_) => DataType::String,
108 Self::Number(n) => match n {
109 NumberValue::Int8(_) => DataType::Number(NumberDataType::Int8),
110 NumberValue::Int16(_) => DataType::Number(NumberDataType::Int16),
111 NumberValue::Int32(_) => DataType::Number(NumberDataType::Int32),
112 NumberValue::Int64(_) => DataType::Number(NumberDataType::Int64),
113 NumberValue::UInt8(_) => DataType::Number(NumberDataType::UInt8),
114 NumberValue::UInt16(_) => DataType::Number(NumberDataType::UInt16),
115 NumberValue::UInt32(_) => DataType::Number(NumberDataType::UInt32),
116 NumberValue::UInt64(_) => DataType::Number(NumberDataType::UInt64),
117 NumberValue::Float32(_) => DataType::Number(NumberDataType::Float32),
118 NumberValue::Float64(_) => DataType::Number(NumberDataType::Float64),
119 NumberValue::Decimal128(_, s) => DataType::Decimal(DecimalDataType::Decimal128(*s)),
120 NumberValue::Decimal256(_, s) => DataType::Decimal(DecimalDataType::Decimal256(*s)),
121 },
122 Self::Timestamp(_) => DataType::Timestamp,
123
124 Self::Date(_) => DataType::Date,
125 Self::Interval(_) => DataType::Interval,
126 Self::Array(vals) => {
127 if vals.is_empty() {
128 DataType::EmptyArray
129 } else {
130 DataType::Array(Box::new(vals[0].get_type()))
131 }
132 }
133 Self::Map(kvs) => {
134 if kvs.is_empty() {
135 DataType::EmptyMap
136 } else {
137 let inner_ty = DataType::Tuple(vec![kvs[0].0.get_type(), kvs[0].1.get_type()]);
138 DataType::Map(Box::new(inner_ty))
139 }
140 }
141 Self::Tuple(vals) => {
142 let inner_tys = vals.iter().map(|v| v.get_type()).collect::<Vec<_>>();
143 DataType::Tuple(inner_tys)
144 }
145 Self::Bitmap(_) => DataType::Bitmap,
146 Self::Variant(_) => DataType::Variant,
147 Self::Geometry(_) => DataType::Geometry,
148 Self::Geography(_) => DataType::Geography,
149 Self::Vector(v) => DataType::Vector(v.len() as u64),
150 }
151 }
152}
153
154impl TryFrom<(&DataType, Option<String>)> for Value {
155 type Error = Error;
156
157 fn try_from((t, v): (&DataType, Option<String>)) -> Result<Self> {
158 match v {
159 Some(v) => Self::try_from((t, v)),
160 None => match t {
161 DataType::Null => Ok(Self::Null),
162 DataType::Nullable(_) => Ok(Self::Null),
163 _ => Err(Error::InvalidResponse(
164 "NULL value for non-nullable field".to_string(),
165 )),
166 },
167 }
168 }
169}
170
171impl TryFrom<(&DataType, String)> for Value {
172 type Error = Error;
173
174 fn try_from((t, v): (&DataType, String)) -> Result<Self> {
175 match t {
176 DataType::Null => Ok(Self::Null),
177 DataType::EmptyArray => Ok(Self::EmptyArray),
178 DataType::EmptyMap => Ok(Self::EmptyMap),
179 DataType::Boolean => Ok(Self::Boolean(v == "1")),
180 DataType::Binary => Ok(Self::Binary(hex::decode(v)?)),
181 DataType::String => Ok(Self::String(v)),
182 DataType::Number(NumberDataType::Int8) => {
183 Ok(Self::Number(NumberValue::Int8(v.parse()?)))
184 }
185 DataType::Number(NumberDataType::Int16) => {
186 Ok(Self::Number(NumberValue::Int16(v.parse()?)))
187 }
188 DataType::Number(NumberDataType::Int32) => {
189 Ok(Self::Number(NumberValue::Int32(v.parse()?)))
190 }
191 DataType::Number(NumberDataType::Int64) => {
192 Ok(Self::Number(NumberValue::Int64(v.parse()?)))
193 }
194 DataType::Number(NumberDataType::UInt8) => {
195 Ok(Self::Number(NumberValue::UInt8(v.parse()?)))
196 }
197 DataType::Number(NumberDataType::UInt16) => {
198 Ok(Self::Number(NumberValue::UInt16(v.parse()?)))
199 }
200 DataType::Number(NumberDataType::UInt32) => {
201 Ok(Self::Number(NumberValue::UInt32(v.parse()?)))
202 }
203 DataType::Number(NumberDataType::UInt64) => {
204 Ok(Self::Number(NumberValue::UInt64(v.parse()?)))
205 }
206 DataType::Number(NumberDataType::Float32) => {
207 Ok(Self::Number(NumberValue::Float32(v.parse()?)))
208 }
209 DataType::Number(NumberDataType::Float64) => {
210 Ok(Self::Number(NumberValue::Float64(v.parse()?)))
211 }
212 DataType::Decimal(DecimalDataType::Decimal128(size)) => {
213 let d = parse_decimal(v.as_str(), *size)?;
214 Ok(Self::Number(d))
215 }
216 DataType::Decimal(DecimalDataType::Decimal256(size)) => {
217 let d = parse_decimal(v.as_str(), *size)?;
218 Ok(Self::Number(d))
219 }
220 DataType::Timestamp => Ok(Self::Timestamp(
221 NaiveDateTime::parse_from_str(v.as_str(), "%Y-%m-%d %H:%M:%S%.6f")?
222 .and_utc()
223 .timestamp_micros(),
224 )),
225 DataType::Date => Ok(Self::Date(
226 NaiveDate::parse_from_str(v.as_str(), "%Y-%m-%d")?.num_days_from_ce()
227 - DAYS_FROM_CE,
228 )),
229 DataType::Bitmap => Ok(Self::Bitmap(v)),
230 DataType::Variant => Ok(Self::Variant(v)),
231 DataType::Geometry => Ok(Self::Geometry(v)),
232 DataType::Geography => Ok(Self::Geography(v)),
233 DataType::Interval => Ok(Self::Interval(v)),
234 DataType::Array(_) | DataType::Map(_) | DataType::Tuple(_) | DataType::Vector(_) => {
235 let mut reader = Cursor::new(v.as_str());
236 let decoder = ValueDecoder {};
237 decoder.read_field(t, &mut reader)
238 }
239 DataType::Nullable(inner) => match inner.as_ref() {
240 DataType::String => Ok(Self::String(v.to_string())),
241 _ => {
242 if v == NULL_VALUE {
245 Ok(Self::Null)
246 } else {
247 Self::try_from((inner.as_ref(), v))
248 }
249 }
250 },
251 }
252 }
253}
254
255#[cfg(feature = "flight-sql")]
256impl TryFrom<(&ArrowField, &Arc<dyn ArrowArray>, usize)> for Value {
257 type Error = Error;
258 fn try_from(
259 (field, array, seq): (&ArrowField, &Arc<dyn ArrowArray>, usize),
260 ) -> std::result::Result<Self, Self::Error> {
261 if let Some(extend_type) = field.metadata().get(EXTENSION_KEY) {
262 return match extend_type.as_str() {
263 ARROW_EXT_TYPE_EMPTY_ARRAY => Ok(Value::EmptyArray),
264 ARROW_EXT_TYPE_EMPTY_MAP => Ok(Value::EmptyMap),
265 ARROW_EXT_TYPE_VARIANT => {
266 if field.is_nullable() && array.is_null(seq) {
267 return Ok(Value::Null);
268 }
269 match array.as_any().downcast_ref::<LargeBinaryArray>() {
270 Some(array) => {
271 Ok(Value::Variant(RawJsonb::new(array.value(seq)).to_string()))
272 }
273 None => Err(ConvertError::new("variant", format!("{array:?}")).into()),
274 }
275 }
276 ARROW_EXT_TYPE_INTERVAL => {
277 if field.is_nullable() && array.is_null(seq) {
278 return Ok(Value::Null);
279 }
280 match array.as_any().downcast_ref::<Decimal128Array>() {
281 Some(array) => {
282 let res = months_days_micros(array.value(seq));
283 Ok(Value::Interval(
284 Interval {
285 months: res.months(),
286 days: res.days(),
287 micros: res.microseconds(),
288 }
289 .to_string(),
290 ))
291 }
292 None => Err(ConvertError::new("Interval", format!("{array:?}")).into()),
293 }
294 }
295 ARROW_EXT_TYPE_BITMAP => {
296 if field.is_nullable() && array.is_null(seq) {
297 return Ok(Value::Null);
298 }
299 match array.as_any().downcast_ref::<LargeBinaryArray>() {
300 Some(array) => {
301 let rb = roaring::RoaringTreemap::deserialize_from(array.value(seq))
302 .expect("failed to deserialize bitmap");
303 let raw = rb.into_iter().collect::<Vec<_>>();
304 let s = itertools::join(raw.iter(), ",");
305 Ok(Value::Bitmap(s))
306 }
307 None => Err(ConvertError::new("bitmap", format!("{array:?}")).into()),
308 }
309 }
310 ARROW_EXT_TYPE_GEOMETRY => {
311 if field.is_nullable() && array.is_null(seq) {
312 return Ok(Value::Null);
313 }
314 match array.as_any().downcast_ref::<LargeBinaryArray>() {
315 Some(array) => {
316 let wkt = parse_geometry(array.value(seq))?;
317 Ok(Value::Geometry(wkt))
318 }
319 None => Err(ConvertError::new("geometry", format!("{array:?}")).into()),
320 }
321 }
322 ARROW_EXT_TYPE_GEOGRAPHY => {
323 if field.is_nullable() && array.is_null(seq) {
324 return Ok(Value::Null);
325 }
326 match array.as_any().downcast_ref::<LargeBinaryArray>() {
327 Some(array) => {
328 let wkt = parse_geometry(array.value(seq))?;
329 Ok(Value::Geography(wkt))
330 }
331 None => Err(ConvertError::new("geography", format!("{array:?}")).into()),
332 }
333 }
334 ARROW_EXT_TYPE_VECTOR => {
335 if field.is_nullable() && array.is_null(seq) {
336 return Ok(Value::Null);
337 }
338 match field.data_type() {
339 ArrowDataType::FixedSizeList(_, dimension) => {
340 match array
341 .as_any()
342 .downcast_ref::<arrow_array::FixedSizeListArray>()
343 {
344 Some(inner_array) => {
345 match inner_array
346 .value(seq)
347 .as_any()
348 .downcast_ref::<Float32Array>()
349 {
350 Some(inner_array) => {
351 let dimension = *dimension as usize;
352 let mut values = Vec::with_capacity(dimension);
353 for i in 0..dimension {
354 let value = inner_array.value(i);
355 values.push(value);
356 }
357 Ok(Value::Vector(values))
358 }
359 None => Err(ConvertError::new(
360 "vector float32",
361 format!("{inner_array:?}"),
362 )
363 .into()),
364 }
365 }
366 None => {
367 Err(ConvertError::new("vector", format!("{array:?}")).into())
368 }
369 }
370 }
371 arrow_type => Err(ConvertError::new(
372 "vector",
373 format!("Unsupported Arrow type: {arrow_type:?}"),
374 )
375 .into()),
376 }
377 }
378 _ => Err(ConvertError::new(
379 "extension",
380 format!("Unsupported extension datatype for arrow field: {field:?}"),
381 )
382 .into()),
383 };
384 }
385
386 if field.is_nullable() && array.is_null(seq) {
387 return Ok(Value::Null);
388 }
389 match field.data_type() {
390 ArrowDataType::Null => Ok(Value::Null),
391 ArrowDataType::Boolean => match array.as_any().downcast_ref::<BooleanArray>() {
392 Some(array) => Ok(Value::Boolean(array.value(seq))),
393 None => Err(ConvertError::new("bool", format!("{array:?}")).into()),
394 },
395 ArrowDataType::Int8 => match array.as_any().downcast_ref::<Int8Array>() {
396 Some(array) => Ok(Value::Number(NumberValue::Int8(array.value(seq)))),
397 None => Err(ConvertError::new("int8", format!("{array:?}")).into()),
398 },
399 ArrowDataType::Int16 => match array.as_any().downcast_ref::<Int16Array>() {
400 Some(array) => Ok(Value::Number(NumberValue::Int16(array.value(seq)))),
401 None => Err(ConvertError::new("int16", format!("{array:?}")).into()),
402 },
403 ArrowDataType::Int32 => match array.as_any().downcast_ref::<Int32Array>() {
404 Some(array) => Ok(Value::Number(NumberValue::Int32(array.value(seq)))),
405 None => Err(ConvertError::new("int64", format!("{array:?}")).into()),
406 },
407 ArrowDataType::Int64 => match array.as_any().downcast_ref::<Int64Array>() {
408 Some(array) => Ok(Value::Number(NumberValue::Int64(array.value(seq)))),
409 None => Err(ConvertError::new("int64", format!("{array:?}")).into()),
410 },
411 ArrowDataType::UInt8 => match array.as_any().downcast_ref::<UInt8Array>() {
412 Some(array) => Ok(Value::Number(NumberValue::UInt8(array.value(seq)))),
413 None => Err(ConvertError::new("uint8", format!("{array:?}")).into()),
414 },
415 ArrowDataType::UInt16 => match array.as_any().downcast_ref::<UInt16Array>() {
416 Some(array) => Ok(Value::Number(NumberValue::UInt16(array.value(seq)))),
417 None => Err(ConvertError::new("uint16", format!("{array:?}")).into()),
418 },
419 ArrowDataType::UInt32 => match array.as_any().downcast_ref::<UInt32Array>() {
420 Some(array) => Ok(Value::Number(NumberValue::UInt32(array.value(seq)))),
421 None => Err(ConvertError::new("uint32", format!("{array:?}")).into()),
422 },
423 ArrowDataType::UInt64 => match array.as_any().downcast_ref::<UInt64Array>() {
424 Some(array) => Ok(Value::Number(NumberValue::UInt64(array.value(seq)))),
425 None => Err(ConvertError::new("uint64", format!("{array:?}")).into()),
426 },
427 ArrowDataType::Float32 => match array.as_any().downcast_ref::<Float32Array>() {
428 Some(array) => Ok(Value::Number(NumberValue::Float32(array.value(seq)))),
429 None => Err(ConvertError::new("float32", format!("{array:?}")).into()),
430 },
431 ArrowDataType::Float64 => match array.as_any().downcast_ref::<Float64Array>() {
432 Some(array) => Ok(Value::Number(NumberValue::Float64(array.value(seq)))),
433 None => Err(ConvertError::new("float64", format!("{array:?}")).into()),
434 },
435
436 ArrowDataType::Decimal128(p, s) => {
437 match array.as_any().downcast_ref::<Decimal128Array>() {
438 Some(array) => Ok(Value::Number(NumberValue::Decimal128(
439 array.value(seq),
440 DecimalSize {
441 precision: *p,
442 scale: *s as u8,
443 },
444 ))),
445 None => Err(ConvertError::new("Decimal128", format!("{array:?}")).into()),
446 }
447 }
448 ArrowDataType::Decimal256(p, s) => {
449 match array.as_any().downcast_ref::<Decimal256Array>() {
450 Some(array) => Ok(Value::Number(NumberValue::Decimal256(
451 array.value(seq),
452 DecimalSize {
453 precision: *p,
454 scale: *s as u8,
455 },
456 ))),
457 None => Err(ConvertError::new("Decimal256", format!("{array:?}")).into()),
458 }
459 }
460
461 ArrowDataType::Binary => match array.as_any().downcast_ref::<BinaryArray>() {
462 Some(array) => Ok(Value::Binary(array.value(seq).to_vec())),
463 None => Err(ConvertError::new("binary", format!("{array:?}")).into()),
464 },
465 ArrowDataType::LargeBinary | ArrowDataType::FixedSizeBinary(_) => {
466 match array.as_any().downcast_ref::<LargeBinaryArray>() {
467 Some(array) => Ok(Value::Binary(array.value(seq).to_vec())),
468 None => Err(ConvertError::new("large binary", format!("{array:?}")).into()),
469 }
470 }
471 ArrowDataType::Utf8 => match array.as_any().downcast_ref::<StringArray>() {
472 Some(array) => Ok(Value::String(array.value(seq).to_string())),
473 None => Err(ConvertError::new("string", format!("{array:?}")).into()),
474 },
475 ArrowDataType::LargeUtf8 => match array.as_any().downcast_ref::<LargeStringArray>() {
476 Some(array) => Ok(Value::String(array.value(seq).to_string())),
477 None => Err(ConvertError::new("large string", format!("{array:?}")).into()),
478 },
479 ArrowDataType::Utf8View => match array.as_any().downcast_ref::<StringViewArray>() {
480 Some(array) => Ok(Value::String(array.value(seq).to_string())),
481 None => Err(ConvertError::new("string view", format!("{array:?}")).into()),
482 },
483 ArrowDataType::Timestamp(unit, tz) => {
485 match array.as_any().downcast_ref::<TimestampMicrosecondArray>() {
486 Some(array) => {
487 if unit != &TimeUnit::Microsecond {
488 return Err(ConvertError::new("timestamp", format!("{array:?}"))
489 .with_message(format!(
490 "unsupported timestamp unit: {unit:?}, only support microsecond"
491 ))
492 .into());
493 }
494 let ts = array.value(seq);
495 match tz {
496 None => Ok(Value::Timestamp(ts)),
497 Some(tz) => Err(ConvertError::new("timestamp", format!("{array:?}"))
498 .with_message(format!("non-UTC timezone not supported: {tz:?}"))
499 .into()),
500 }
501 }
502 None => Err(ConvertError::new("timestamp", format!("{array:?}")).into()),
503 }
504 }
505 ArrowDataType::Date32 => match array.as_any().downcast_ref::<Date32Array>() {
506 Some(array) => Ok(Value::Date(array.value(seq))),
507 None => Err(ConvertError::new("date", format!("{array:?}")).into()),
508 },
509 ArrowDataType::List(f) => match array.as_any().downcast_ref::<ListArray>() {
510 Some(array) => {
511 let inner_array = unsafe { array.value_unchecked(seq) };
512 let mut values = Vec::with_capacity(inner_array.len());
513 for i in 0..inner_array.len() {
514 let value = Value::try_from((f.as_ref(), &inner_array, i))?;
515 values.push(value);
516 }
517 Ok(Value::Array(values))
518 }
519 None => Err(ConvertError::new("list", format!("{array:?}")).into()),
520 },
521 ArrowDataType::LargeList(f) => match array.as_any().downcast_ref::<LargeListArray>() {
522 Some(array) => {
523 let inner_array = unsafe { array.value_unchecked(seq) };
524 let mut values = Vec::with_capacity(inner_array.len());
525 for i in 0..inner_array.len() {
526 let value = Value::try_from((f.as_ref(), &inner_array, i))?;
527 values.push(value);
528 }
529 Ok(Value::Array(values))
530 }
531 None => Err(ConvertError::new("large list", format!("{array:?}")).into()),
532 },
533 ArrowDataType::Map(f, _) => match array.as_any().downcast_ref::<MapArray>() {
534 Some(array) => {
535 if let ArrowDataType::Struct(fs) = f.data_type() {
536 let inner_array = unsafe { array.value_unchecked(seq) };
537 let mut values = Vec::with_capacity(inner_array.len());
538 for i in 0..inner_array.len() {
539 let key = Value::try_from((fs[0].as_ref(), inner_array.column(0), i))?;
540 let val = Value::try_from((fs[1].as_ref(), inner_array.column(1), i))?;
541 values.push((key, val));
542 }
543 Ok(Value::Map(values))
544 } else {
545 Err(
546 ConvertError::new("invalid map inner type", format!("{array:?}"))
547 .into(),
548 )
549 }
550 }
551 None => Err(ConvertError::new("map", format!("{array:?}")).into()),
552 },
553 ArrowDataType::Struct(fs) => match array.as_any().downcast_ref::<StructArray>() {
554 Some(array) => {
555 let mut values = Vec::with_capacity(array.len());
556 for (f, inner_array) in fs.iter().zip(array.columns().iter()) {
557 let value = Value::try_from((f.as_ref(), inner_array, seq))?;
558 values.push(value);
559 }
560 Ok(Value::Tuple(values))
561 }
562 None => Err(ConvertError::new("struct", format!("{array:?}")).into()),
563 },
564 _ => Err(ConvertError::new("unsupported data type", format!("{array:?}")).into()),
565 }
566 }
567}
568
569impl TryFrom<Value> for String {
570 type Error = Error;
571 fn try_from(val: Value) -> Result<Self> {
572 match val {
573 Value::String(s) => Ok(s),
574 Value::Bitmap(s) => Ok(s),
575 Value::Number(NumberValue::Decimal128(v, s)) => Ok(display_decimal_128(v, s.scale)),
576 Value::Number(NumberValue::Decimal256(v, s)) => Ok(display_decimal_256(v, s.scale)),
577 Value::Geometry(s) => Ok(s),
578 Value::Geography(s) => Ok(s),
579 Value::Interval(s) => Ok(s),
580 Value::Variant(s) => Ok(s),
581 _ => Err(ConvertError::new("string", format!("{val:?}")).into()),
582 }
583 }
584}
585
586impl TryFrom<Value> for bool {
587 type Error = Error;
588 fn try_from(val: Value) -> Result<Self> {
589 match val {
590 Value::Boolean(b) => Ok(b),
591 Value::Number(n) => Ok(n != NumberValue::Int8(0)),
592 _ => Err(ConvertError::new("bool", format!("{val:?}")).into()),
593 }
594 }
595}
596
597macro_rules! impl_try_from_number_value {
599 ($($t:ty),*) => {
600 $(
601 impl TryFrom<Value> for $t {
602 type Error = Error;
603 fn try_from(val: Value) -> Result<Self> {
604 match val {
605 Value::Number(NumberValue::Int8(i)) => Ok(i as $t),
606 Value::Number(NumberValue::Int16(i)) => Ok(i as $t),
607 Value::Number(NumberValue::Int32(i)) => Ok(i as $t),
608 Value::Number(NumberValue::Int64(i)) => Ok(i as $t),
609 Value::Number(NumberValue::UInt8(i)) => Ok(i as $t),
610 Value::Number(NumberValue::UInt16(i)) => Ok(i as $t),
611 Value::Number(NumberValue::UInt32(i)) => Ok(i as $t),
612 Value::Number(NumberValue::UInt64(i)) => Ok(i as $t),
613 Value::Number(NumberValue::Float32(i)) => Ok(i as $t),
614 Value::Number(NumberValue::Float64(i)) => Ok(i as $t),
615 Value::Date(i) => Ok(i as $t),
616 Value::Timestamp(i) => Ok(i as $t),
617 _ => Err(ConvertError::new("number", format!("{:?}", val)).into()),
618 }
619 }
620 }
621 )*
622 };
623}
624
625impl_try_from_number_value!(u8);
626impl_try_from_number_value!(u16);
627impl_try_from_number_value!(u32);
628impl_try_from_number_value!(u64);
629impl_try_from_number_value!(i8);
630impl_try_from_number_value!(i16);
631impl_try_from_number_value!(i32);
632impl_try_from_number_value!(i64);
633impl_try_from_number_value!(f32);
634impl_try_from_number_value!(f64);
635
636impl TryFrom<Value> for NaiveDateTime {
637 type Error = Error;
638 fn try_from(val: Value) -> Result<Self> {
639 match val {
640 Value::Timestamp(i) => {
641 let secs = i / 1_000_000;
642 let nanos = ((i % 1_000_000) * 1000) as u32;
643 match DateTime::from_timestamp(secs, nanos) {
644 Some(t) => Ok(t.naive_utc()),
645 None => Err(ConvertError::new("NaiveDateTime", "".to_string()).into()),
646 }
647 }
648 _ => Err(ConvertError::new("NaiveDateTime", format!("{val}")).into()),
649 }
650 }
651}
652
653impl TryFrom<Value> for NaiveDate {
654 type Error = Error;
655 fn try_from(val: Value) -> Result<Self> {
656 match val {
657 Value::Date(i) => {
658 let days = i + DAYS_FROM_CE;
659 match NaiveDate::from_num_days_from_ce_opt(days) {
660 Some(d) => Ok(d),
661 None => Err(ConvertError::new("NaiveDate", "".to_string()).into()),
662 }
663 }
664 _ => Err(ConvertError::new("NaiveDate", format!("{val}")).into()),
665 }
666 }
667}
668
669impl<V> TryFrom<Value> for Vec<V>
670where
671 V: TryFrom<Value, Error = Error>,
672{
673 type Error = Error;
674 fn try_from(val: Value) -> Result<Self> {
675 match val {
676 Value::Binary(vals) => vals
677 .into_iter()
678 .map(|v| V::try_from(Value::Number(NumberValue::UInt8(v))))
679 .collect(),
680 Value::Array(vals) => vals.into_iter().map(V::try_from).collect(),
681 Value::EmptyArray => Ok(vec![]),
682 _ => Err(ConvertError::new("Vec", format!("{val}")).into()),
683 }
684 }
685}
686
687impl<K, V> TryFrom<Value> for HashMap<K, V>
688where
689 K: TryFrom<Value, Error = Error> + Eq + Hash,
690 V: TryFrom<Value, Error = Error>,
691{
692 type Error = Error;
693 fn try_from(val: Value) -> Result<Self> {
694 match val {
695 Value::Map(kvs) => {
696 let mut map = HashMap::new();
697 for (k, v) in kvs {
698 let k = K::try_from(k)?;
699 let v = V::try_from(v)?;
700 map.insert(k, v);
701 }
702 Ok(map)
703 }
704 Value::EmptyMap => Ok(HashMap::new()),
705 _ => Err(ConvertError::new("HashMap", format!("{val}")).into()),
706 }
707 }
708}
709
710macro_rules! replace_expr {
711 ($_t:tt $sub:expr) => {
712 $sub
713 };
714}
715
716macro_rules! impl_tuple_from_value {
718 ( $($Ti:tt),+ ) => {
719 impl<$($Ti),+> TryFrom<Value> for ($($Ti,)+)
720 where
721 $($Ti: TryFrom<Value>),+
722 {
723 type Error = String;
724 fn try_from(val: Value) -> Result<Self, String> {
725 let expected_len = <[()]>::len(&[$(replace_expr!(($Ti) ())),*]);
729
730 match val {
731 Value::Tuple(vals) => {
732 if expected_len != vals.len() {
733 return Err(format!("value tuple size mismatch: expected {} columns, got {}", expected_len, vals.len()));
734 }
735 let mut vals_iter = vals.into_iter().enumerate();
736
737 Ok((
738 $(
739 {
740 let (col_ix, col_value) = vals_iter
741 .next()
742 .unwrap(); let t = col_value.get_type();
745 $Ti::try_from(col_value)
746 .map_err(|_| format!("failed converting column {} from type({:?}) to type({})", col_ix, t, std::any::type_name::<$Ti>()))?
747 }
748 ,)+
749 ))
750 }
751 _ => Err(format!("expected tuple, got {:?}", val)),
752 }
753 }
754 }
755 }
756}
757
758impl_tuple_from_value!(T1);
760impl_tuple_from_value!(T1, T2);
761impl_tuple_from_value!(T1, T2, T3);
762impl_tuple_from_value!(T1, T2, T3, T4);
763impl_tuple_from_value!(T1, T2, T3, T4, T5);
764impl_tuple_from_value!(T1, T2, T3, T4, T5, T6);
765impl_tuple_from_value!(T1, T2, T3, T4, T5, T6, T7);
766impl_tuple_from_value!(T1, T2, T3, T4, T5, T6, T7, T8);
767impl_tuple_from_value!(T1, T2, T3, T4, T5, T6, T7, T8, T9);
768impl_tuple_from_value!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10);
769impl_tuple_from_value!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11);
770impl_tuple_from_value!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12);
771impl_tuple_from_value!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13);
772impl_tuple_from_value!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14);
773impl_tuple_from_value!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15);
774impl_tuple_from_value!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16);
775impl_tuple_from_value!(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17);
776impl_tuple_from_value!(
777 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18
778);
779impl_tuple_from_value!(
780 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19
781);
782impl_tuple_from_value!(
783 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20
784);
785impl_tuple_from_value!(
786 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21
787);
788impl_tuple_from_value!(
789 T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21,
790 T22
791);
792
793macro_rules! impl_try_from_to_option {
795 ($($t:ty),*) => {
796 $(
797 impl TryFrom<Value> for Option<$t> {
798 type Error = Error;
799 fn try_from(val: Value) -> Result<Self> {
800 match val {
801 Value::Null => Ok(None),
802 _ => {
803 let inner: $t = val.try_into()?;
804 Ok(Some(inner))
805 },
806 }
807
808 }
809 }
810 )*
811 };
812}
813
814impl_try_from_to_option!(String);
815impl_try_from_to_option!(bool);
816impl_try_from_to_option!(u8);
817impl_try_from_to_option!(u16);
818impl_try_from_to_option!(u32);
819impl_try_from_to_option!(u64);
820impl_try_from_to_option!(i8);
821impl_try_from_to_option!(i16);
822impl_try_from_to_option!(i32);
823impl_try_from_to_option!(i64);
824impl_try_from_to_option!(f32);
825impl_try_from_to_option!(f64);
826impl_try_from_to_option!(NaiveDateTime);
827impl_try_from_to_option!(NaiveDate);
828
829impl std::fmt::Display for NumberValue {
830 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
831 match self {
832 NumberValue::Int8(i) => write!(f, "{i}"),
833 NumberValue::Int16(i) => write!(f, "{i}"),
834 NumberValue::Int32(i) => write!(f, "{i}"),
835 NumberValue::Int64(i) => write!(f, "{i}"),
836 NumberValue::UInt8(i) => write!(f, "{i}"),
837 NumberValue::UInt16(i) => write!(f, "{i}"),
838 NumberValue::UInt32(i) => write!(f, "{i}"),
839 NumberValue::UInt64(i) => write!(f, "{i}"),
840 NumberValue::Float32(i) => write!(f, "{i}"),
841 NumberValue::Float64(i) => write!(f, "{i}"),
842 NumberValue::Decimal128(v, s) => write!(f, "{}", display_decimal_128(*v, s.scale)),
843 NumberValue::Decimal256(v, s) => write!(f, "{}", display_decimal_256(*v, s.scale)),
844 }
845 }
846}
847
848impl std::fmt::Display for Value {
849 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
850 encode_value(f, self, true)
851 }
852}
853
854fn encode_value(f: &mut std::fmt::Formatter<'_>, val: &Value, raw: bool) -> std::fmt::Result {
856 match val {
857 Value::Null => write!(f, "NULL"),
858 Value::EmptyArray => write!(f, "[]"),
859 Value::EmptyMap => write!(f, "{{}}"),
860 Value::Boolean(b) => {
861 if *b {
862 write!(f, "true")
863 } else {
864 write!(f, "false")
865 }
866 }
867 Value::Number(n) => write!(f, "{n}"),
868 Value::Binary(s) => write!(f, "{}", hex::encode_upper(s)),
869 Value::String(s)
870 | Value::Bitmap(s)
871 | Value::Variant(s)
872 | Value::Interval(s)
873 | Value::Geometry(s)
874 | Value::Geography(s) => {
875 if raw {
876 write!(f, "{s}")
877 } else {
878 write!(f, "'{s}'")
879 }
880 }
881 Value::Timestamp(micros) => {
882 let (mut secs, mut nanos) = (*micros / 1_000_000, (*micros % 1_000_000) * 1_000);
883 if nanos < 0 {
884 secs -= 1;
885 nanos += 1_000_000_000;
886 }
887 let t = DateTime::from_timestamp(secs, nanos as _).unwrap_or_default();
888 let t = t.naive_utc();
889 if raw {
890 write!(f, "{}", t.format(TIMESTAMP_FORMAT))
891 } else {
892 write!(f, "'{}'", t.format(TIMESTAMP_FORMAT))
893 }
894 }
895 Value::Date(i) => {
896 let days = i + DAYS_FROM_CE;
897 let d = NaiveDate::from_num_days_from_ce_opt(days).unwrap_or_default();
898 if raw {
899 write!(f, "{d}")
900 } else {
901 write!(f, "'{d}'")
902 }
903 }
904 Value::Array(vals) => {
905 write!(f, "[")?;
906 for (i, val) in vals.iter().enumerate() {
907 if i > 0 {
908 write!(f, ",")?;
909 }
910 encode_value(f, val, false)?;
911 }
912 write!(f, "]")?;
913 Ok(())
914 }
915 Value::Map(kvs) => {
916 write!(f, "{{")?;
917 for (i, (key, val)) in kvs.iter().enumerate() {
918 if i > 0 {
919 write!(f, ",")?;
920 }
921 encode_value(f, key, false)?;
922 write!(f, ":")?;
923 encode_value(f, val, false)?;
924 }
925 write!(f, "}}")?;
926 Ok(())
927 }
928 Value::Tuple(vals) => {
929 write!(f, "(")?;
930 for (i, val) in vals.iter().enumerate() {
931 if i > 0 {
932 write!(f, ",")?;
933 }
934 encode_value(f, val, false)?;
935 }
936 write!(f, ")")?;
937 Ok(())
938 }
939 Value::Vector(vals) => {
940 write!(f, "[")?;
941 for (i, val) in vals.iter().enumerate() {
942 if i > 0 {
943 write!(f, ",")?;
944 }
945 write!(f, "{val}")?;
946 }
947 write!(f, "]")?;
948 Ok(())
949 }
950 }
951}
952
953pub fn display_decimal_128(num: i128, scale: u8) -> String {
954 let mut buf = String::new();
955 if scale == 0 {
956 write!(buf, "{num}").unwrap();
957 } else {
958 let pow_scale = 10_i128.pow(scale as u32);
959 if num >= 0 {
960 write!(
961 buf,
962 "{}.{:0>width$}",
963 num / pow_scale,
964 (num % pow_scale).abs(),
965 width = scale as usize
966 )
967 .unwrap();
968 } else {
969 write!(
970 buf,
971 "-{}.{:0>width$}",
972 -num / pow_scale,
973 (num % pow_scale).abs(),
974 width = scale as usize
975 )
976 .unwrap();
977 }
978 }
979 buf
980}
981
982pub fn display_decimal_256(num: i256, scale: u8) -> String {
983 let mut buf = String::new();
984 if scale == 0 {
985 write!(buf, "{num}").unwrap();
986 } else {
987 let pow_scale = i256::from_i128(10i128).wrapping_pow(scale as u32);
988 let width = scale as usize;
989 let (int_part, neg) = if num >= i256::ZERO {
991 (num / pow_scale, "")
992 } else {
993 (-num / pow_scale, "-")
994 };
995 let frac_part = (num % pow_scale).wrapping_abs();
996
997 match frac_part.to_i128() {
998 Some(frac_part) => {
999 write!(buf, "{neg}{int_part}.{frac_part:0>width$}").unwrap();
1000 }
1001 None => {
1002 let pow = i256::from_i128(10i128).wrapping_pow(38);
1005 let frac_high_part = frac_part / pow;
1006 let frac_low_part = frac_part % pow;
1007 let frac_width = (scale - 38) as usize;
1008
1009 write!(
1010 buf,
1011 "{neg}{int_part}.{:0>frac_width$}{}",
1012 frac_high_part.to_i128().unwrap(),
1013 frac_low_part.to_i128().unwrap(),
1014 )
1015 .unwrap();
1016 }
1017 }
1018 }
1019 buf
1020}
1021
1022pub fn parse_decimal(text: &str, size: DecimalSize) -> Result<NumberValue> {
1025 let mut start = 0;
1026 let bytes = text.as_bytes();
1027 let mut is_negative = false;
1028
1029 if bytes[start] == b'-' {
1031 is_negative = true;
1032 start += 1;
1033 }
1034
1035 while start < text.len() && bytes[start] == b'0' {
1036 start += 1
1037 }
1038 let text = &text[start..];
1039 let point_pos = text.find('.');
1040 let e_pos = text.find(|c| ['E', 'e'].contains(&c));
1041 let (i_part, f_part, e_part) = match (point_pos, e_pos) {
1042 (Some(p1), Some(p2)) => (&text[..p1], &text[(p1 + 1)..p2], Some(&text[(p2 + 1)..])),
1043 (Some(p), None) => (&text[..p], &text[(p + 1)..], None),
1044 (None, Some(p)) => (&text[..p], "", Some(&text[(p + 1)..])),
1045 (None, None) => (text, "", None),
1046 };
1047 let exp = match e_part {
1048 Some(s) => s.parse::<i32>()?,
1049 None => 0,
1050 };
1051 if i_part.len() as i32 + exp > 76 {
1052 Err(ConvertError::new("decimal", format!("{text:?}")).into())
1053 } else {
1054 let mut digits = Vec::with_capacity(76);
1055 digits.extend_from_slice(i_part.as_bytes());
1056 digits.extend_from_slice(f_part.as_bytes());
1057 if digits.is_empty() {
1058 digits.push(b'0')
1059 }
1060 let scale = f_part.len() as i32 - exp;
1061 if scale < 0 {
1062 for _ in 0..(-scale) {
1064 digits.push(b'0')
1065 }
1066 };
1067
1068 let precision = std::cmp::min(digits.len(), 76);
1069 let digits = unsafe { std::str::from_utf8_unchecked(&digits[..precision]) };
1070
1071 let result = if size.precision > 38 {
1072 NumberValue::Decimal256(i256::from_string(digits).unwrap(), size)
1073 } else {
1074 NumberValue::Decimal128(digits.parse::<i128>()?, size)
1075 };
1076
1077 if is_negative {
1079 match result {
1080 NumberValue::Decimal256(val, size) => Ok(NumberValue::Decimal256(-val, size)),
1081 NumberValue::Decimal128(val, size) => Ok(NumberValue::Decimal128(-val, size)),
1082 _ => Ok(result),
1083 }
1084 } else {
1085 Ok(result)
1086 }
1087 }
1088}
1089
1090#[derive(Debug, Copy, Clone, PartialEq, Default)]
1091pub struct Interval {
1092 pub months: i32,
1093 pub days: i32,
1094 pub micros: i64,
1095}
1096
1097impl Display for Interval {
1098 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
1099 let mut buffer = [0u8; 70];
1100 let len = IntervalToStringCast::format(*self, &mut buffer);
1101 write!(f, "{}", String::from_utf8_lossy(&buffer[..len]))
1102 }
1103}
1104
1105struct IntervalToStringCast;
1106
1107impl IntervalToStringCast {
1108 fn format_signed_number(value: i64, buffer: &mut [u8], length: &mut usize) {
1109 let s = value.to_string();
1110 let bytes = s.as_bytes();
1111 buffer[*length..*length + bytes.len()].copy_from_slice(bytes);
1112 *length += bytes.len();
1113 }
1114
1115 fn format_two_digits(value: i64, buffer: &mut [u8], length: &mut usize) {
1116 let s = format!("{:02}", value.abs());
1117 let bytes = s.as_bytes();
1118 buffer[*length..*length + bytes.len()].copy_from_slice(bytes);
1119 *length += bytes.len();
1120 }
1121
1122 fn format_interval_value(value: i32, buffer: &mut [u8], length: &mut usize, name: &str) {
1123 if value == 0 {
1124 return;
1125 }
1126 if *length != 0 {
1127 buffer[*length] = b' ';
1128 *length += 1;
1129 }
1130 Self::format_signed_number(value as i64, buffer, length);
1131 let name_bytes = name.as_bytes();
1132 buffer[*length..*length + name_bytes.len()].copy_from_slice(name_bytes);
1133 *length += name_bytes.len();
1134 if value != 1 && value != -1 {
1135 buffer[*length] = b's';
1136 *length += 1;
1137 }
1138 }
1139
1140 fn format_micros(mut micros: i64, buffer: &mut [u8], length: &mut usize) {
1141 if micros < 0 {
1142 micros = -micros;
1143 }
1144 let s = format!("{micros:06}");
1145 let bytes = s.as_bytes();
1146 buffer[*length..*length + bytes.len()].copy_from_slice(bytes);
1147 *length += bytes.len();
1148
1149 while *length > 0 && buffer[*length - 1] == b'0' {
1150 *length -= 1;
1151 }
1152 }
1153
1154 pub fn format(interval: Interval, buffer: &mut [u8]) -> usize {
1155 let mut length = 0;
1156 if interval.months != 0 {
1157 let years = interval.months / 12;
1158 let months = interval.months - years * 12;
1159 Self::format_interval_value(years, buffer, &mut length, " year");
1160 Self::format_interval_value(months, buffer, &mut length, " month");
1161 }
1162 if interval.days != 0 {
1163 Self::format_interval_value(interval.days, buffer, &mut length, " day");
1164 }
1165 if interval.micros != 0 {
1166 if length != 0 {
1167 buffer[length] = b' ';
1168 length += 1;
1169 }
1170 let mut micros = interval.micros;
1171 if micros < 0 {
1172 buffer[length] = b'-';
1173 length += 1;
1174 micros = -micros;
1175 }
1176 let hour = micros / MINROS_PER_HOUR;
1177 micros -= hour * MINROS_PER_HOUR;
1178 let min = micros / MICROS_PER_MINUTE;
1179 micros -= min * MICROS_PER_MINUTE;
1180 let sec = micros / MICROS_PER_SEC;
1181 micros -= sec * MICROS_PER_SEC;
1182
1183 Self::format_signed_number(hour, buffer, &mut length);
1184 buffer[length] = b':';
1185 length += 1;
1186 Self::format_two_digits(min, buffer, &mut length);
1187 buffer[length] = b':';
1188 length += 1;
1189 Self::format_two_digits(sec, buffer, &mut length);
1190 if micros != 0 {
1191 buffer[length] = b'.';
1192 length += 1;
1193 Self::format_micros(micros, buffer, &mut length);
1194 }
1195 } else if length == 0 {
1196 buffer[..8].copy_from_slice(b"00:00:00");
1197 return 8;
1198 }
1199 length
1200 }
1201}
1202
1203impl Interval {
1204 pub fn from_string(str: &str) -> Result<Self> {
1205 Self::from_cstring(str.as_bytes())
1206 }
1207
1208 pub fn from_cstring(str: &[u8]) -> Result<Self> {
1209 let mut result = Interval::default();
1210 let mut pos = 0;
1211 let len = str.len();
1212 let mut found_any = false;
1213
1214 if len == 0 {
1215 return Err(Error::BadArgument("Empty string".to_string()));
1216 }
1217 match str[pos] {
1218 b'@' => {
1219 pos += 1;
1220 }
1221 b'P' | b'p' => {
1222 return Err(Error::BadArgument(
1223 "Posix intervals not supported yet".to_string(),
1224 ));
1225 }
1226 _ => {}
1227 }
1228
1229 while pos < len {
1230 match str[pos] {
1231 b' ' | b'\t' | b'\n' => {
1232 pos += 1;
1233 continue;
1234 }
1235 b'0'..=b'9' => {
1236 let (number, fraction, next_pos) = parse_number(&str[pos..])?;
1237 pos += next_pos;
1238 let (specifier, next_pos) = parse_identifier(&str[pos..]);
1239
1240 pos += next_pos;
1241 let _ = apply_specifier(&mut result, number, fraction, &specifier);
1242 found_any = true;
1243 }
1244 b'-' => {
1245 pos += 1;
1246 let (number, fraction, next_pos) = parse_number(&str[pos..])?;
1247 let number = -number;
1248 let fraction = -fraction;
1249
1250 pos += next_pos;
1251
1252 let (specifier, next_pos) = parse_identifier(&str[pos..]);
1253
1254 pos += next_pos;
1255 let _ = apply_specifier(&mut result, number, fraction, &specifier);
1256 found_any = true;
1257 }
1258 b'a' | b'A' => {
1259 if len - pos < 3
1260 || str[pos + 1] != b'g' && str[pos + 1] != b'G'
1261 || str[pos + 2] != b'o' && str[pos + 2] != b'O'
1262 {
1263 return Err(Error::BadArgument("Invalid 'ago' specifier".to_string()));
1264 }
1265 pos += 3;
1266 while pos < len {
1267 match str[pos] {
1268 b' ' | b'\t' | b'\n' => {
1269 pos += 1;
1270 }
1271 _ => {
1272 return Err(Error::BadArgument(
1273 "Trailing characters after 'ago'".to_string(),
1274 ));
1275 }
1276 }
1277 }
1278 result.months = -result.months;
1279 result.days = -result.days;
1280 result.micros = -result.micros;
1281 return Ok(result);
1282 }
1283 _ => {
1284 return Err(Error::BadArgument(format!(
1285 "Unexpected character at position {pos}"
1286 )));
1287 }
1288 }
1289 }
1290
1291 if !found_any {
1292 return Err(Error::BadArgument(
1293 "No interval specifiers found".to_string(),
1294 ));
1295 }
1296 Ok(result)
1297 }
1298}
1299
1300fn parse_number(bytes: &[u8]) -> Result<(i64, i64, usize)> {
1301 let mut number: i64 = 0;
1302 let mut fraction: i64 = 0;
1303 let mut pos = 0;
1304
1305 while pos < bytes.len() && bytes[pos].is_ascii_digit() {
1306 number = number
1307 .checked_mul(10)
1308 .ok_or(Error::BadArgument("Number too large".to_string()))?
1309 + (bytes[pos] - b'0') as i64;
1310 pos += 1;
1311 }
1312
1313 if pos < bytes.len() && bytes[pos] == b'.' {
1314 pos += 1;
1315 let mut mult: i64 = 100000;
1316 while pos < bytes.len() && bytes[pos].is_ascii_digit() {
1317 if mult > 0 {
1318 fraction += (bytes[pos] - b'0') as i64 * mult;
1319 }
1320 mult /= 10;
1321 pos += 1;
1322 }
1323 }
1324 if pos < bytes.len() && bytes[pos] == b':' {
1325 let time_bytes = &bytes[pos..];
1327 let mut time_pos = 0;
1328 let mut total_micros: i64 = number * 60 * 60 * MICROS_PER_SEC;
1329 let mut colon_count = 0;
1330
1331 while colon_count < 2 && time_bytes.len() > time_pos {
1332 let (minute, _, next_pos) = parse_time_part(&time_bytes[time_pos..])?;
1333 let minute_micros = minute * 60 * MICROS_PER_SEC;
1334 total_micros += minute_micros;
1335 time_pos += next_pos;
1336
1337 if time_bytes.len() > time_pos && time_bytes[time_pos] == b':' {
1338 time_pos += 1;
1339 colon_count += 1;
1340 } else {
1341 break;
1342 }
1343 }
1344 if time_bytes.len() > time_pos {
1345 let (seconds, micros, next_pos) = parse_time_part_with_macros(&time_bytes[time_pos..])?;
1346 total_micros += seconds * MICROS_PER_SEC + micros;
1347 time_pos += next_pos;
1348 }
1349 return Ok((total_micros, 0, pos + time_pos));
1350 }
1351
1352 if pos == 0 {
1353 return Err(Error::BadArgument("Expected number".to_string()));
1354 }
1355
1356 Ok((number, fraction, pos))
1357}
1358
1359fn parse_time_part(bytes: &[u8]) -> Result<(i64, i64, usize)> {
1360 let mut number: i64 = 0;
1361 let mut pos = 0;
1362 while pos < bytes.len() && bytes[pos].is_ascii_digit() {
1363 number = number
1364 .checked_mul(10)
1365 .ok_or(Error::BadArgument("Number too large".to_string()))?
1366 + (bytes[pos] - b'0') as i64;
1367 pos += 1;
1368 }
1369 Ok((number, 0, pos))
1370}
1371
1372fn parse_time_part_with_macros(bytes: &[u8]) -> Result<(i64, i64, usize)> {
1373 let mut number: i64 = 0;
1374 let mut fraction: i64 = 0;
1375 let mut pos = 0;
1376
1377 while pos < bytes.len() && bytes[pos].is_ascii_digit() {
1378 number = number
1379 .checked_mul(10)
1380 .ok_or(Error::BadArgument("Number too large".to_string()))?
1381 + (bytes[pos] - b'0') as i64;
1382 pos += 1;
1383 }
1384
1385 if pos < bytes.len() && bytes[pos] == b'.' {
1386 pos += 1;
1387 let mut mult: i64 = 100000;
1388 while pos < bytes.len() && bytes[pos].is_ascii_digit() {
1389 if mult > 0 {
1390 fraction += (bytes[pos] - b'0') as i64 * mult;
1391 }
1392 mult /= 10;
1393 pos += 1;
1394 }
1395 }
1396
1397 Ok((number, fraction, pos))
1398}
1399
1400fn parse_identifier(s: &[u8]) -> (String, usize) {
1401 let mut pos = 0;
1402 while pos < s.len() && (s[pos] == b' ' || s[pos] == b'\t' || s[pos] == b'\n') {
1403 pos += 1;
1404 }
1405 let start_pos = pos;
1406 while pos < s.len() && (s[pos].is_ascii_alphabetic()) {
1407 pos += 1;
1408 }
1409
1410 if pos == start_pos {
1411 return ("".to_string(), pos);
1412 }
1413
1414 let identifier = String::from_utf8_lossy(&s[start_pos..pos]).to_string();
1415 (identifier, pos)
1416}
1417
1418#[derive(Debug, PartialEq, Eq)]
1419enum DatePartSpecifier {
1420 Millennium,
1421 Century,
1422 Decade,
1423 Year,
1424 Quarter,
1425 Month,
1426 Day,
1427 Week,
1428 Microseconds,
1429 Milliseconds,
1430 Second,
1431 Minute,
1432 Hour,
1433}
1434
1435fn try_get_date_part_specifier(specifier_str: &str) -> Result<DatePartSpecifier> {
1436 match specifier_str.to_lowercase().as_str() {
1437 "millennium" | "millennia" => Ok(DatePartSpecifier::Millennium),
1438 "century" | "centuries" => Ok(DatePartSpecifier::Century),
1439 "decade" | "decades" => Ok(DatePartSpecifier::Decade),
1440 "year" | "years" | "y" => Ok(DatePartSpecifier::Year),
1441 "quarter" | "quarters" => Ok(DatePartSpecifier::Quarter),
1442 "month" | "months" | "mon" => Ok(DatePartSpecifier::Month),
1443 "day" | "days" | "d" => Ok(DatePartSpecifier::Day),
1444 "week" | "weeks" | "w" => Ok(DatePartSpecifier::Week),
1445 "microsecond" | "microseconds" | "us" => Ok(DatePartSpecifier::Microseconds),
1446 "millisecond" | "milliseconds" | "ms" => Ok(DatePartSpecifier::Milliseconds),
1447 "second" | "seconds" | "s" => Ok(DatePartSpecifier::Second),
1448 "minute" | "minutes" | "m" => Ok(DatePartSpecifier::Minute),
1449 "hour" | "hours" | "h" => Ok(DatePartSpecifier::Hour),
1450 _ => Err(Error::BadArgument(format!(
1451 "Invalid date part specifier: {specifier_str}"
1452 ))),
1453 }
1454}
1455
1456const MICROS_PER_SEC: i64 = 1_000_000;
1457const MICROS_PER_MSEC: i64 = 1_000;
1458const MICROS_PER_MINUTE: i64 = 60 * MICROS_PER_SEC;
1459const MINROS_PER_HOUR: i64 = 60 * MICROS_PER_MINUTE;
1460const DAYS_PER_WEEK: i32 = 7;
1461const MONTHS_PER_QUARTER: i32 = 3;
1462const MONTHS_PER_YEAR: i32 = 12;
1463const MONTHS_PER_DECADE: i32 = 120;
1464const MONTHS_PER_CENTURY: i32 = 1200;
1465const MONTHS_PER_MILLENNIUM: i32 = 12000;
1466
1467fn apply_specifier(
1468 result: &mut Interval,
1469 number: i64,
1470 fraction: i64,
1471 specifier_str: &str,
1472) -> Result<()> {
1473 if specifier_str.is_empty() {
1474 result.micros = result
1475 .micros
1476 .checked_add(number)
1477 .ok_or(Error::BadArgument("Overflow".to_string()))?;
1478 result.micros = result
1479 .micros
1480 .checked_add(fraction)
1481 .ok_or(Error::BadArgument("Overflow".to_string()))?;
1482 return Ok(());
1483 }
1484
1485 let specifier = try_get_date_part_specifier(specifier_str)?;
1486 match specifier {
1487 DatePartSpecifier::Millennium => {
1488 result.months = result
1489 .months
1490 .checked_add(
1491 number
1492 .checked_mul(MONTHS_PER_MILLENNIUM as i64)
1493 .ok_or(Error::BadArgument("Overflow".to_string()))?
1494 .try_into()
1495 .map_err(|_| Error::BadArgument("Overflow".to_string()))?,
1496 )
1497 .ok_or(Error::BadArgument("Overflow".to_string()))?;
1498 }
1499 DatePartSpecifier::Century => {
1500 result.months = result
1501 .months
1502 .checked_add(
1503 number
1504 .checked_mul(MONTHS_PER_CENTURY as i64)
1505 .ok_or(Error::BadArgument("Overflow".to_string()))?
1506 .try_into()
1507 .map_err(|_| Error::BadArgument("Overflow".to_string()))?,
1508 )
1509 .ok_or(Error::BadArgument("Overflow".to_string()))?;
1510 }
1511 DatePartSpecifier::Decade => {
1512 result.months = result
1513 .months
1514 .checked_add(
1515 number
1516 .checked_mul(MONTHS_PER_DECADE as i64)
1517 .ok_or(Error::BadArgument("Overflow".to_string()))?
1518 .try_into()
1519 .map_err(|_| Error::BadArgument("Overflow".to_string()))?,
1520 )
1521 .ok_or(Error::BadArgument("Overflow".to_string()))?;
1522 }
1523 DatePartSpecifier::Year => {
1524 result.months = result
1525 .months
1526 .checked_add(
1527 number
1528 .checked_mul(MONTHS_PER_YEAR as i64)
1529 .ok_or(Error::BadArgument("Overflow".to_string()))?
1530 .try_into()
1531 .map_err(|_| Error::BadArgument("Overflow".to_string()))?,
1532 )
1533 .ok_or(Error::BadArgument("Overflow".to_string()))?;
1534 }
1535 DatePartSpecifier::Quarter => {
1536 result.months = result
1537 .months
1538 .checked_add(
1539 number
1540 .checked_mul(MONTHS_PER_QUARTER as i64)
1541 .ok_or(Error::BadArgument("Overflow".to_string()))?
1542 .try_into()
1543 .map_err(|_| Error::BadArgument("Overflow".to_string()))?,
1544 )
1545 .ok_or(Error::BadArgument("Overflow".to_string()))?;
1546 }
1547 DatePartSpecifier::Month => {
1548 result.months = result
1549 .months
1550 .checked_add(
1551 number
1552 .try_into()
1553 .map_err(|_| Error::BadArgument("Overflow".to_string()))?,
1554 )
1555 .ok_or(Error::BadArgument("Overflow".to_string()))?;
1556 }
1557 DatePartSpecifier::Day => {
1558 result.days = result
1559 .days
1560 .checked_add(
1561 number
1562 .try_into()
1563 .map_err(|_| Error::BadArgument("Overflow".to_string()))?,
1564 )
1565 .ok_or(Error::BadArgument("Overflow".to_string()))?;
1566 }
1567 DatePartSpecifier::Week => {
1568 result.days = result
1569 .days
1570 .checked_add(
1571 number
1572 .checked_mul(DAYS_PER_WEEK as i64)
1573 .ok_or(Error::BadArgument("Overflow".to_string()))?
1574 .try_into()
1575 .map_err(|_| Error::BadArgument("Overflow".to_string()))?,
1576 )
1577 .ok_or(Error::BadArgument("Overflow".to_string()))?;
1578 }
1579 DatePartSpecifier::Microseconds => {
1580 result.micros = result
1581 .micros
1582 .checked_add(number)
1583 .ok_or(Error::BadArgument("Overflow".to_string()))?;
1584 }
1585 DatePartSpecifier::Milliseconds => {
1586 result.micros = result
1587 .micros
1588 .checked_add(
1589 number
1590 .checked_mul(MICROS_PER_MSEC)
1591 .ok_or(Error::BadArgument("Overflow".to_string()))?,
1592 )
1593 .ok_or(Error::BadArgument("Overflow".to_string()))?;
1594 }
1595 DatePartSpecifier::Second => {
1596 result.micros = result
1597 .micros
1598 .checked_add(
1599 number
1600 .checked_mul(MICROS_PER_SEC)
1601 .ok_or(Error::BadArgument("Overflow".to_string()))?,
1602 )
1603 .ok_or(Error::BadArgument("Overflow".to_string()))?;
1604 }
1605 DatePartSpecifier::Minute => {
1606 result.micros = result
1607 .micros
1608 .checked_add(
1609 number
1610 .checked_mul(MICROS_PER_MINUTE)
1611 .ok_or(Error::BadArgument("Overflow".to_string()))?,
1612 )
1613 .ok_or(Error::BadArgument("Overflow".to_string()))?;
1614 }
1615 DatePartSpecifier::Hour => {
1616 result.micros = result
1617 .micros
1618 .checked_add(
1619 number
1620 .checked_mul(MINROS_PER_HOUR)
1621 .ok_or(Error::BadArgument("Overflow".to_string()))?,
1622 )
1623 .ok_or(Error::BadArgument("Overflow".to_string()))?;
1624 }
1625 }
1626 Ok(())
1627}
1628
1629pub fn parse_geometry(raw_data: &[u8]) -> Result<String> {
1630 let mut data = Cursor::new(raw_data);
1631 let wkt = Ewkt::from_wkb(&mut data, WkbDialect::Ewkb)?;
1632 Ok(wkt.0)
1633}
1634
1635struct ValueDecoder {}
1636
1637impl ValueDecoder {
1638 fn read_field<R: AsRef<[u8]>>(&self, ty: &DataType, reader: &mut Cursor<R>) -> Result<Value> {
1639 match ty {
1640 DataType::Null => self.read_null(reader),
1641 DataType::EmptyArray => self.read_empty_array(reader),
1642 DataType::EmptyMap => self.read_empty_map(reader),
1643 DataType::Boolean => self.read_bool(reader),
1644 DataType::Number(NumberDataType::Int8) => self.read_int8(reader),
1645 DataType::Number(NumberDataType::Int16) => self.read_int16(reader),
1646 DataType::Number(NumberDataType::Int32) => self.read_int32(reader),
1647 DataType::Number(NumberDataType::Int64) => self.read_int64(reader),
1648 DataType::Number(NumberDataType::UInt8) => self.read_uint8(reader),
1649 DataType::Number(NumberDataType::UInt16) => self.read_uint16(reader),
1650 DataType::Number(NumberDataType::UInt32) => self.read_uint32(reader),
1651 DataType::Number(NumberDataType::UInt64) => self.read_uint64(reader),
1652 DataType::Number(NumberDataType::Float32) => self.read_float32(reader),
1653 DataType::Number(NumberDataType::Float64) => self.read_float64(reader),
1654 DataType::Decimal(DecimalDataType::Decimal128(size)) => self.read_decimal(size, reader),
1655 DataType::Decimal(DecimalDataType::Decimal256(size)) => self.read_decimal(size, reader),
1656 DataType::String => self.read_string(reader),
1657 DataType::Binary => self.read_binary(reader),
1658 DataType::Timestamp => self.read_timestamp(reader),
1659 DataType::Date => self.read_date(reader),
1660 DataType::Bitmap => self.read_bitmap(reader),
1661 DataType::Variant => self.read_variant(reader),
1662 DataType::Geometry => self.read_geometry(reader),
1663 DataType::Interval => self.read_interval(reader),
1664 DataType::Geography => self.read_geography(reader),
1665 DataType::Array(inner_ty) => self.read_array(inner_ty.as_ref(), reader),
1666 DataType::Map(inner_ty) => self.read_map(inner_ty.as_ref(), reader),
1667 DataType::Tuple(inner_tys) => self.read_tuple(inner_tys.as_ref(), reader),
1668 DataType::Vector(dimension) => self.read_vector(*dimension as usize, reader),
1669 DataType::Nullable(inner_ty) => self.read_nullable(inner_ty.as_ref(), reader),
1670 }
1671 }
1672
1673 fn match_bytes<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>, bs: &[u8]) -> bool {
1674 let pos = reader.checkpoint();
1675 if reader.ignore_bytes(bs) {
1676 true
1677 } else {
1678 reader.rollback(pos);
1679 false
1680 }
1681 }
1682
1683 fn read_null<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1684 if self.match_bytes(reader, NULL_VALUE.as_bytes()) {
1685 Ok(Value::Null)
1686 } else {
1687 let buf = reader.fill_buf()?;
1688 Err(ConvertError::new("null", String::from_utf8_lossy(buf).to_string()).into())
1689 }
1690 }
1691
1692 fn read_bool<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1693 if self.match_bytes(reader, TRUE_VALUE.as_bytes()) {
1694 Ok(Value::Boolean(true))
1695 } else if self.match_bytes(reader, FALSE_VALUE.as_bytes()) {
1696 Ok(Value::Boolean(false))
1697 } else {
1698 let buf = reader.fill_buf()?;
1699 Err(ConvertError::new("boolean", String::from_utf8_lossy(buf).to_string()).into())
1700 }
1701 }
1702
1703 fn read_int8<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1704 let v: i8 = reader.read_int_text()?;
1705 Ok(Value::Number(NumberValue::Int8(v)))
1706 }
1707
1708 fn read_int16<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1709 let v: i16 = reader.read_int_text()?;
1710 Ok(Value::Number(NumberValue::Int16(v)))
1711 }
1712
1713 fn read_int32<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1714 let v: i32 = reader.read_int_text()?;
1715 Ok(Value::Number(NumberValue::Int32(v)))
1716 }
1717
1718 fn read_int64<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1719 let v: i64 = reader.read_int_text()?;
1720 Ok(Value::Number(NumberValue::Int64(v)))
1721 }
1722
1723 fn read_uint8<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1724 let v: u8 = reader.read_int_text()?;
1725 Ok(Value::Number(NumberValue::UInt8(v)))
1726 }
1727
1728 fn read_uint16<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1729 let v: u16 = reader.read_int_text()?;
1730 Ok(Value::Number(NumberValue::UInt16(v)))
1731 }
1732
1733 fn read_uint32<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1734 let v: u32 = reader.read_int_text()?;
1735 Ok(Value::Number(NumberValue::UInt32(v)))
1736 }
1737
1738 fn read_uint64<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1739 let v: u64 = reader.read_int_text()?;
1740 Ok(Value::Number(NumberValue::UInt64(v)))
1741 }
1742
1743 fn read_float32<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1744 let v: f32 = reader.read_float_text()?;
1745 Ok(Value::Number(NumberValue::Float32(v)))
1746 }
1747
1748 fn read_float64<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1749 let v: f64 = reader.read_float_text()?;
1750 Ok(Value::Number(NumberValue::Float64(v)))
1751 }
1752
1753 fn read_decimal<R: AsRef<[u8]>>(
1754 &self,
1755 size: &DecimalSize,
1756 reader: &mut Cursor<R>,
1757 ) -> Result<Value> {
1758 let buf = reader.fill_buf()?;
1759 let (n_in, _) = collect_number(buf);
1762 let v = unsafe { std::str::from_utf8_unchecked(&buf[..n_in]) };
1763 let d = parse_decimal(v, *size)?;
1764 reader.consume(n_in);
1765 Ok(Value::Number(d))
1766 }
1767
1768 fn read_string<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1769 let mut buf = Vec::new();
1770 reader.read_quoted_text(&mut buf, b'\'')?;
1771 Ok(Value::String(unsafe { String::from_utf8_unchecked(buf) }))
1772 }
1773
1774 fn read_binary<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1775 let buf = reader.fill_buf()?;
1776 let n = collect_binary_number(buf);
1777 let v = buf[..n].to_vec();
1778 reader.consume(n);
1779 Ok(Value::Binary(hex::decode(v)?))
1780 }
1781
1782 fn read_date<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1783 let mut buf = Vec::new();
1784 reader.read_quoted_text(&mut buf, b'\'')?;
1785 let v = unsafe { std::str::from_utf8_unchecked(&buf) };
1786 let days = NaiveDate::parse_from_str(v, "%Y-%m-%d")?.num_days_from_ce() - DAYS_FROM_CE;
1787 Ok(Value::Date(days))
1788 }
1789
1790 fn read_timestamp<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1791 let mut buf = Vec::new();
1792 reader.read_quoted_text(&mut buf, b'\'')?;
1793 let v = unsafe { std::str::from_utf8_unchecked(&buf) };
1794 let ts = NaiveDateTime::parse_from_str(v, "%Y-%m-%d %H:%M:%S%.6f")?
1795 .and_utc()
1796 .timestamp_micros();
1797 Ok(Value::Timestamp(ts))
1798 }
1799
1800 fn read_interval<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1801 let mut buf = Vec::new();
1802 reader.read_quoted_text(&mut buf, b'\'')?;
1803 Ok(Value::Interval(unsafe { String::from_utf8_unchecked(buf) }))
1804 }
1805
1806 fn read_bitmap<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1807 let mut buf = Vec::new();
1808 reader.read_quoted_text(&mut buf, b'\'')?;
1809 Ok(Value::Bitmap(unsafe { String::from_utf8_unchecked(buf) }))
1810 }
1811
1812 fn read_variant<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1813 let mut buf = Vec::new();
1814 reader.read_quoted_text(&mut buf, b'\'')?;
1815 Ok(Value::Variant(unsafe { String::from_utf8_unchecked(buf) }))
1816 }
1817
1818 fn read_geometry<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1819 let mut buf = Vec::new();
1820 reader.read_quoted_text(&mut buf, b'\'')?;
1821 Ok(Value::Geometry(unsafe { String::from_utf8_unchecked(buf) }))
1822 }
1823
1824 fn read_geography<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1825 let mut buf = Vec::new();
1826 reader.read_quoted_text(&mut buf, b'\'')?;
1827 Ok(Value::Geography(unsafe {
1828 String::from_utf8_unchecked(buf)
1829 }))
1830 }
1831
1832 fn read_nullable<R: AsRef<[u8]>>(
1833 &self,
1834 ty: &DataType,
1835 reader: &mut Cursor<R>,
1836 ) -> Result<Value> {
1837 match self.read_null(reader) {
1838 Ok(val) => Ok(val),
1839 Err(_) => self.read_field(ty, reader),
1840 }
1841 }
1842
1843 fn read_empty_array<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1844 reader.must_ignore_byte(b'[')?;
1845 reader.must_ignore_byte(b']')?;
1846 Ok(Value::EmptyArray)
1847 }
1848
1849 fn read_empty_map<R: AsRef<[u8]>>(&self, reader: &mut Cursor<R>) -> Result<Value> {
1850 reader.must_ignore_byte(b'{')?;
1851 reader.must_ignore_byte(b'}')?;
1852 Ok(Value::EmptyArray)
1853 }
1854
1855 fn read_array<R: AsRef<[u8]>>(&self, ty: &DataType, reader: &mut Cursor<R>) -> Result<Value> {
1856 let mut vals = Vec::new();
1857 reader.must_ignore_byte(b'[')?;
1858 for idx in 0.. {
1859 let _ = reader.ignore_white_spaces();
1860 if reader.ignore_byte(b']') {
1861 break;
1862 }
1863 if idx != 0 {
1864 reader.must_ignore_byte(b',')?;
1865 }
1866 let _ = reader.ignore_white_spaces();
1867 let val = self.read_field(ty, reader)?;
1868 vals.push(val);
1869 }
1870 Ok(Value::Array(vals))
1871 }
1872
1873 fn read_vector<R: AsRef<[u8]>>(
1874 &self,
1875 dimension: usize,
1876 reader: &mut Cursor<R>,
1877 ) -> Result<Value> {
1878 let mut vals = Vec::with_capacity(dimension);
1879 reader.must_ignore_byte(b'[')?;
1880 for idx in 0..dimension {
1881 let _ = reader.ignore_white_spaces();
1882 if idx > 0 {
1883 reader.must_ignore_byte(b',')?;
1884 }
1885 let _ = reader.ignore_white_spaces();
1886 let val: f32 = reader.read_float_text()?;
1887 vals.push(val);
1888 }
1889 reader.must_ignore_byte(b']')?;
1890 Ok(Value::Vector(vals))
1891 }
1892
1893 fn read_map<R: AsRef<[u8]>>(&self, ty: &DataType, reader: &mut Cursor<R>) -> Result<Value> {
1894 const KEY: usize = 0;
1895 const VALUE: usize = 1;
1896 let mut kvs = Vec::new();
1897 reader.must_ignore_byte(b'{')?;
1898 match ty {
1899 DataType::Tuple(inner_tys) => {
1900 for idx in 0.. {
1901 let _ = reader.ignore_white_spaces();
1902 if reader.ignore_byte(b'}') {
1903 break;
1904 }
1905 if idx != 0 {
1906 reader.must_ignore_byte(b',')?;
1907 }
1908 let _ = reader.ignore_white_spaces();
1909 let key = self.read_field(&inner_tys[KEY], reader)?;
1910 let _ = reader.ignore_white_spaces();
1911 reader.must_ignore_byte(b':')?;
1912 let _ = reader.ignore_white_spaces();
1913 let val = self.read_field(&inner_tys[VALUE], reader)?;
1914 kvs.push((key, val));
1915 }
1916 Ok(Value::Map(kvs))
1917 }
1918 _ => unreachable!(),
1919 }
1920 }
1921
1922 fn read_tuple<R: AsRef<[u8]>>(
1923 &self,
1924 tys: &[DataType],
1925 reader: &mut Cursor<R>,
1926 ) -> Result<Value> {
1927 let mut vals = Vec::new();
1928 reader.must_ignore_byte(b'(')?;
1929 for (idx, ty) in tys.iter().enumerate() {
1930 let _ = reader.ignore_white_spaces();
1931 if idx != 0 {
1932 reader.must_ignore_byte(b',')?;
1933 }
1934 let _ = reader.ignore_white_spaces();
1935 let val = self.read_field(ty, reader)?;
1936 vals.push(val);
1937 }
1938 reader.must_ignore_byte(b')')?;
1939 Ok(Value::Tuple(vals))
1940 }
1941}
1942
1943#[derive(Debug, Copy, Clone, Default, PartialEq, PartialOrd, Ord, Eq, Hash)]
1945#[allow(non_camel_case_types)]
1946#[repr(C)]
1947pub struct months_days_micros(pub i128);
1948
1949pub const MICROS_MASK: i128 = 0xFFFFFFFFFFFFFFFF;
1951pub const DAYS_MONTHS_MASK: i128 = 0xFFFFFFFF;
1953
1954impl months_days_micros {
1955 pub fn new(months: i32, days: i32, microseconds: i64) -> Self {
1957 let months_bits = (months as i128) << 96;
1958 let days_bits = ((days as u32) as i128) << 64;
1961 let micros_bits = (microseconds as u64) as i128;
1962
1963 Self(months_bits | days_bits | micros_bits)
1964 }
1965
1966 #[inline]
1967 pub fn months(&self) -> i32 {
1968 ((self.0 >> 96) & DAYS_MONTHS_MASK) as i32
1970 }
1971
1972 #[inline]
1973 pub fn days(&self) -> i32 {
1974 ((self.0 >> 64) & DAYS_MONTHS_MASK) as i32
1975 }
1976
1977 #[inline]
1978 pub fn microseconds(&self) -> i64 {
1979 (self.0 & MICROS_MASK) as i64
1980 }
1981}
1982
1983#[cfg(test)]
1984mod tests {
1985 use super::*;
1986
1987 #[test]
1988 fn test_from_string_basic_positive() {
1989 let interval = Interval::from_string("0:00:00.000001").unwrap();
1990 assert_eq!(interval.micros, 1);
1991 }
1992}