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