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