databend_driver_core/
value.rs

1// Copyright 2021 Datafuse Labs
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use 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
53// Thu 1970-01-01 is R.D. 719163
54const 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    /// Microseconds from 1970-01-01 00:00:00 UTC
86    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                    // not string type, try to check if it is NULL
243                    // for compatible with old version server
244                    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            // we only support timestamp in microsecond in databend
484            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
597// This macro implements TryFrom for NumberValue
598macro_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
716// This macro implements TryFrom for tuple of types
717macro_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                // It is not possible yet to get the number of metavariable repetitions
726                // ref: https://github.com/rust-lang/lang-team/issues/28#issue-644523674
727                // This is a workaround
728                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(); // vals_iter size is checked before this code is reached,
743                                                   // so it is safe to unwrap
744                                    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
758// Implement From Value for tuples of size up to 16
759impl_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
793// This macro implements TryFrom to Option for Nullable column
794macro_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
854// Compatible with Databend, inner values of nested types are quoted.
855fn 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        // -1/10 = 0
990        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                // fractional part is too big for display,
1003                // split it into two parts.
1004                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
1022/// assume text is from
1023/// used only for expr, so put more weight on readability
1024pub 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    // Check if the number is negative
1030    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            // e.g 123.1e3
1063            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 the number was negative, negate the result
1078        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        // parse time format HH:MM:SS[.FFFFFF]
1326        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        // parser decimal need fractional part.
1760        // 10.00 and 10 is different value.
1761        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/// The in-memory representation of the MonthDayMicros variant of the "Interval" logical type.
1944#[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
1949/// Mask for extracting the lower 64 bits (microseconds).
1950pub const MICROS_MASK: i128 = 0xFFFFFFFFFFFFFFFF;
1951/// Mask for extracting the middle 32 bits (days or months).
1952pub const DAYS_MONTHS_MASK: i128 = 0xFFFFFFFF;
1953
1954impl months_days_micros {
1955    /// A new [`months_days_micros`].
1956    pub fn new(months: i32, days: i32, microseconds: i64) -> Self {
1957        let months_bits = (months as i128) << 96;
1958        // converting to u32 before i128 ensures we’re working with the raw, unsigned bit pattern of the i32 value,
1959        // preventing unwanted sign extension when that value is later used within the i128.
1960        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        // Decoding logic
1969        ((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}