1use std::collections::HashMap;
16use std::fmt::{Display, Formatter, Write};
17use std::hash::Hash;
18use std::io::BufRead;
19use std::io::Cursor;
20
21use arrow_buffer::i256;
22use chrono::{DateTime, Datelike, NaiveDate, NaiveDateTime};
23use geozero::wkb::FromWkb;
24use geozero::wkb::WkbDialect;
25use geozero::wkt::Ewkt;
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
54const 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 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 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 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
611macro_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
730macro_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 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(); 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
772impl_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
807macro_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
868fn 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 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 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
1036pub 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 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 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 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 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 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#[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
1963pub const MICROS_MASK: i128 = 0xFFFFFFFFFFFFFFFF;
1965pub const DAYS_MONTHS_MASK: i128 = 0xFFFFFFFF;
1967
1968impl months_days_micros {
1969 pub fn new(months: i32, days: i32, microseconds: i64) -> Self {
1971 let months_bits = (months as i128) << 96;
1972 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 ((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
1997impl 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
2176impl 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}