databend_driver_core/
value.rs

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