1use {
2 crate::{
3 data::{Interval, Value},
4 result::{Error, Result},
5 },
6 chrono::{Datelike, NaiveDate, NaiveDateTime, NaiveTime, Timelike},
7 ordered_float::OrderedFloat,
8 rust_decimal::Decimal,
9 serde::{Deserialize, Serialize},
10 std::{cmp::Ordering, fmt::Debug, net::IpAddr},
11 thiserror::Error as ThisError,
12};
13
14#[derive(ThisError, Debug, PartialEq, Eq, Serialize)]
15pub enum KeyError {
16 #[error("FLOAT data type cannot be converted to Big-Endian bytes for comparison")]
17 FloatToCmpBigEndianNotSupported,
18
19 #[error("MAP data type cannot be used as Key")]
20 MapTypeKeyNotSupported,
21
22 #[error("LIST data type cannot be used as Key")]
23 ListTypeKeyNotSupported,
24
25 #[error("POINT data type cannot be used as Key")]
26 PointTypeKeyNotSupported,
27}
28
29#[derive(PartialEq, Eq, Hash, Clone, Debug, Serialize, Deserialize)]
30pub enum Key {
31 I8(i8),
32 I16(i16),
33 I32(i32),
34 I64(i64),
35 I128(i128),
36 U8(u8),
37 U16(u16),
38 U32(u32),
39 U64(u64),
40 U128(u128),
41 F32(OrderedFloat<f32>),
42 F64(OrderedFloat<f64>),
43 Decimal(Decimal),
44 Bool(bool),
45 Str(String),
46 Bytea(Vec<u8>),
47 Date(NaiveDate),
48 Timestamp(NaiveDateTime),
49 Time(NaiveTime),
50 Interval(Interval),
51 Uuid(u128),
52 Inet(IpAddr),
53 None,
54}
55
56impl Ord for Key {
57 fn cmp(&self, other: &Self) -> Ordering {
58 match (self, other) {
59 (Key::I8(l), Key::I8(r)) => l.cmp(r),
60 (Key::I16(l), Key::I16(r)) => l.cmp(r),
61 (Key::I32(l), Key::I32(r)) => l.cmp(r),
62 (Key::I64(l), Key::I64(r)) => l.cmp(r),
63 (Key::I128(l), Key::I128(r)) => l.cmp(r),
64 (Key::U8(l), Key::U8(r)) => l.cmp(r),
65 (Key::U16(l), Key::U16(r)) => l.cmp(r),
66 (Key::U32(l), Key::U32(r)) => l.cmp(r),
67 (Key::U64(l), Key::U64(r)) => l.cmp(r),
68 (Key::U128(l), Key::U128(r)) | (Key::Uuid(l), Key::Uuid(r)) => l.cmp(r),
69 (Key::F32(l), Key::F32(r)) => l.total_cmp(&r.0),
70 (Key::F64(l), Key::F64(r)) => l.total_cmp(&r.0),
71 (Key::Decimal(l), Key::Decimal(r)) => l.cmp(r),
72 (Key::Bool(l), Key::Bool(r)) => l.cmp(r),
73 (Key::Str(l), Key::Str(r)) => l.cmp(r),
74 (Key::Bytea(l), Key::Bytea(r)) => l.cmp(r),
75 (Key::Date(l), Key::Date(r)) => l.cmp(r),
76 (Key::Timestamp(l), Key::Timestamp(r)) => l.cmp(r),
77 (Key::Time(l), Key::Time(r)) => l.cmp(r),
78 (Key::Interval(l), Key::Interval(r)) => l.partial_cmp(r).unwrap_or(match (l, r) {
79 (Interval::Month(_), Interval::Microsecond(_)) => Ordering::Greater,
80 _ => Ordering::Less,
81 }),
82 (Key::Inet(l), Key::Inet(r)) => l.cmp(r),
83 (Key::None, Key::None) => Ordering::Equal,
84 (Key::None, _) => Ordering::Greater,
85 (_, Key::None) => Ordering::Less,
86
87 (left, right) => {
88 if left.to_order() <= right.to_order() {
89 Ordering::Greater
90 } else {
91 Ordering::Less
92 }
93 }
94 }
95 }
96}
97
98impl PartialOrd for Key {
99 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
100 Some(self.cmp(other))
101 }
102}
103
104impl TryFrom<Value> for Key {
105 type Error = Error;
106
107 fn try_from(value: Value) -> Result<Self> {
108 use Value::*;
109
110 match value {
111 Bool(v) => Ok(Key::Bool(v)),
112 I8(v) => Ok(Key::I8(v)),
113 I16(v) => Ok(Key::I16(v)),
114 I32(v) => Ok(Key::I32(v)),
115 I64(v) => Ok(Key::I64(v)),
116 I128(v) => Ok(Key::I128(v)),
117 U8(v) => Ok(Key::U8(v)),
118 U16(v) => Ok(Key::U16(v)),
119 U32(v) => Ok(Key::U32(v)),
120 U64(v) => Ok(Key::U64(v)),
121 U128(v) => Ok(Key::U128(v)),
122 F32(v) => Ok(Key::F32(OrderedFloat(v))),
123 F64(v) => Ok(Key::F64(OrderedFloat(v))),
124 Decimal(v) => Ok(Key::Decimal(v)),
125 Str(v) => Ok(Key::Str(v)),
126 Bytea(v) => Ok(Key::Bytea(v)),
127 Inet(v) => Ok(Key::Inet(v)),
128 Date(v) => Ok(Key::Date(v)),
129 Timestamp(v) => Ok(Key::Timestamp(v)),
130 Time(v) => Ok(Key::Time(v)),
131 Interval(v) => Ok(Key::Interval(v)),
132 Uuid(v) => Ok(Key::Uuid(v)),
133 Null => Ok(Key::None),
134 Map(_) => Err(KeyError::MapTypeKeyNotSupported.into()),
135 List(_) => Err(KeyError::ListTypeKeyNotSupported.into()),
136 Point(_) => Err(KeyError::PointTypeKeyNotSupported.into()),
137 }
138 }
139}
140
141impl TryFrom<&Value> for Key {
142 type Error = Error;
143
144 fn try_from(value: &Value) -> Result<Self> {
145 value.clone().try_into()
146 }
147}
148
149impl From<Key> for Value {
150 fn from(key: Key) -> Self {
151 match key {
152 Key::Bool(v) => Value::Bool(v),
153 Key::I8(v) => Value::I8(v),
154 Key::I16(v) => Value::I16(v),
155 Key::I32(v) => Value::I32(v),
156 Key::I64(v) => Value::I64(v),
157 Key::I128(v) => Value::I128(v),
158 Key::U8(v) => Value::U8(v),
159 Key::U16(v) => Value::U16(v),
160 Key::U32(v) => Value::U32(v),
161 Key::U64(v) => Value::U64(v),
162 Key::U128(v) => Value::U128(v),
163 Key::F32(v) => Value::F32(v.0),
164 Key::F64(v) => Value::F64(v.0),
165 Key::Decimal(v) => Value::Decimal(v),
166 Key::Str(v) => Value::Str(v),
167 Key::Bytea(v) => Value::Bytea(v),
168 Key::Inet(v) => Value::Inet(v),
169 Key::Date(v) => Value::Date(v),
170 Key::Timestamp(v) => Value::Timestamp(v),
171 Key::Time(v) => Value::Time(v),
172 Key::Interval(v) => Value::Interval(v),
173 Key::Uuid(v) => Value::Uuid(v),
174 Key::None => Value::Null,
175 }
176 }
177}
178
179const VALUE: u8 = 0;
180const NONE: u8 = 1;
181
182impl Key {
183 pub fn to_cmp_be_bytes(&self) -> Result<Vec<u8>> {
185 Ok(match self {
186 Key::Bool(v) => {
187 if *v {
188 vec![VALUE, 1]
189 } else {
190 vec![VALUE, 0]
191 }
192 }
193 Key::I8(v) => {
194 let sign = u8::from(*v >= 0);
195
196 [VALUE, sign]
197 .iter()
198 .chain(v.to_be_bytes().iter())
199 .copied()
200 .collect::<Vec<_>>()
201 }
202 Key::I16(v) => {
203 let sign = u8::from(*v >= 0);
204
205 [VALUE, sign]
206 .iter()
207 .chain(v.to_be_bytes().iter())
208 .copied()
209 .collect::<Vec<_>>()
210 }
211 Key::I32(v) => {
212 let sign = u8::from(*v >= 0);
213
214 [VALUE, sign]
215 .iter()
216 .chain(v.to_be_bytes().iter())
217 .copied()
218 .collect::<Vec<_>>()
219 }
220 Key::I64(v) => {
221 let sign = u8::from(*v >= 0);
222
223 [VALUE, sign]
224 .iter()
225 .chain(v.to_be_bytes().iter())
226 .copied()
227 .collect::<Vec<_>>()
228 }
229 Key::I128(v) => {
230 let sign = u8::from(*v >= 0);
231
232 [VALUE, sign]
233 .iter()
234 .chain(v.to_be_bytes().iter())
235 .copied()
236 .collect::<Vec<_>>()
237 }
238 Key::U8(v) => [VALUE, 1]
239 .iter()
240 .chain(v.to_be_bytes().iter())
241 .copied()
242 .collect::<Vec<_>>(),
243 Key::U16(v) => [VALUE, 1]
244 .iter()
245 .chain(v.to_be_bytes().iter())
246 .copied()
247 .collect::<Vec<_>>(),
248 Key::U32(v) => [VALUE, 1]
249 .iter()
250 .chain(v.to_be_bytes().iter())
251 .copied()
252 .collect::<Vec<_>>(),
253 Key::U64(v) => [VALUE, 1]
254 .iter()
255 .chain(v.to_be_bytes().iter())
256 .copied()
257 .collect::<Vec<_>>(),
258 Key::U128(v) => [VALUE, 1]
259 .iter()
260 .chain(v.to_be_bytes().iter())
261 .copied()
262 .collect::<Vec<_>>(),
263 Key::F32(_) | Key::F64(_) => {
264 return Err(KeyError::FloatToCmpBigEndianNotSupported.into());
265 }
266 Key::Decimal(v) => {
267 let sign = u8::from(v.is_sign_positive());
268 let convert = |v: Decimal| {
269 let v = v.unpack();
270 let v = i128::from(v.lo) + (i128::from(v.mid) << 32) + (i128::from(v.hi) << 64);
271
272 if sign == 0 { -v } else { v }
273 };
274
275 [VALUE, sign]
276 .into_iter()
277 .chain(convert(v.trunc()).to_be_bytes())
278 .chain(convert(v.fract()).to_be_bytes())
279 .collect::<Vec<_>>()
280 }
281 Key::Str(v) => [VALUE]
282 .iter()
283 .chain(v.as_bytes().iter())
284 .copied()
285 .collect::<Vec<_>>(),
286 Key::Bytea(v) => v.clone(),
287 Key::Inet(v) => match v {
288 IpAddr::V4(v) => v.octets().to_vec(),
289 IpAddr::V6(v) => v.octets().to_vec(),
290 },
291 Key::Date(date) => [VALUE]
292 .iter()
293 .chain(date.num_days_from_ce().to_be_bytes().iter())
294 .copied()
295 .collect::<Vec<_>>(),
296 Key::Time(time) => {
297 let secs = time.num_seconds_from_midnight();
298 let frac = time.nanosecond();
299
300 [VALUE]
301 .iter()
302 .chain(secs.to_be_bytes().iter())
303 .chain(frac.to_be_bytes().iter())
304 .copied()
305 .collect::<Vec<_>>()
306 }
307 Key::Timestamp(datetime) => {
308 let date = datetime.num_days_from_ce();
309 let secs = datetime.num_seconds_from_midnight();
310 let frac = datetime.nanosecond();
311
312 [VALUE]
313 .iter()
314 .chain(date.to_be_bytes().iter())
315 .chain(secs.to_be_bytes().iter())
316 .chain(frac.to_be_bytes().iter())
317 .copied()
318 .collect::<Vec<_>>()
319 }
320 Key::Interval(interval) => {
321 let (month, microsec) = match interval {
322 Interval::Month(month) => (*month, 0),
323 Interval::Microsecond(microsec) => (0, *microsec),
324 };
325
326 [VALUE]
327 .iter()
328 .chain(month.to_be_bytes().iter())
329 .chain(microsec.to_be_bytes().iter())
330 .copied()
331 .collect::<Vec<_>>()
332 }
333 Key::Uuid(v) => [VALUE]
334 .iter()
335 .chain(v.to_be_bytes().iter())
336 .copied()
337 .collect::<Vec<_>>(),
338 Key::None => vec![NONE],
339 })
340 }
341
342 fn to_order(&self) -> u8 {
343 match self {
344 Key::I8(_) => 1,
345 Key::I16(_) => 2,
346 Key::I32(_) => 3,
347 Key::I64(_) => 4,
348 Key::I128(_) => 5,
349 Key::U8(_) => 6,
350 Key::U16(_) => 7,
351 Key::U32(_) => 8,
352 Key::U64(_) => 9,
353 Key::U128(_) => 10,
354 Key::F32(_) => 11,
355 Key::F64(_) => 12,
356 Key::Decimal(_) => 13,
357 Key::Bool(_) => 14,
358 Key::Str(_) => 15,
359 Key::Bytea(_) => 16,
360 Key::Date(_) => 17,
361 Key::Timestamp(_) => 18,
362 Key::Time(_) => 19,
363 Key::Interval(_) => 20,
364 Key::Uuid(_) => 21,
365 Key::Inet(_) => 22,
366 Key::None => 23,
367 }
368 }
369}
370
371#[cfg(test)]
372mod tests {
373 use {
374 crate::{
375 data::{Interval, Key, KeyError, Point, Value},
376 executor::evaluate_stateless,
377 parse_sql::parse_expr,
378 result::Result,
379 translate::{NO_PARAMS, translate_expr},
380 },
381 chrono::{DateTime, NaiveDate, NaiveTime},
382 futures::executor::block_on,
383 rust_decimal::Decimal,
384 std::{cmp::Ordering, collections::BTreeMap, net::IpAddr, str::FromStr},
385 };
386
387 fn convert(sql: &str) -> Result<Key> {
388 let parsed = parse_expr(sql).expect(sql);
389 let expr = translate_expr(&parsed, NO_PARAMS).expect(sql);
390
391 block_on(evaluate_stateless(None, &expr))
392 .expect(sql)
393 .try_into()
394 }
395
396 #[test]
397 fn evaluated_to_key() {
398 assert_eq!(convert("True"), Ok(Key::Bool(true)));
400 assert_eq!(convert("CAST(11 AS INT8)"), Ok(Key::I8(11)));
401 assert_eq!(convert("CAST(11 AS INT16)"), Ok(Key::I16(11)));
402 assert_eq!(convert("CAST(11 AS INT32)"), Ok(Key::I32(11)));
403 assert_eq!(convert("2048"), Ok(Key::I64(2048)));
404 assert_eq!(convert("CAST(1024 AS INT128)"), Ok(Key::I128(1024)));
405 assert_eq!(convert("CAST(11 AS UINT8)"), Ok(Key::U8(11)));
406 assert_eq!(convert("CAST(11 AS UINT16)"), Ok(Key::U16(11)));
407 assert_eq!(convert("CAST(11 AS UINT32)"), Ok(Key::U32(11)));
408 assert_eq!(convert("CAST(11 AS UINT64)"), Ok(Key::U64(11)));
409 assert_eq!(convert("CAST(11 AS UINT128)"), Ok(Key::U128(11)));
410 assert!(matches!(convert("CAST(12.03 AS FLOAT32)"), Ok(Key::F32(_))));
411 assert!(matches!(convert("12.03"), Ok(Key::F64(_))));
412
413 assert_eq!(
414 convert("CAST(123.45 AS DECIMAL)"),
415 Ok(Key::Decimal(Decimal::from_str("123.45").unwrap()))
416 );
417 assert_eq!(
418 convert("CAST(0 AS INET)"),
419 Ok(Key::Inet(IpAddr::from_str("0.0.0.0").unwrap()))
420 );
421
422 assert_eq!(
423 convert("'Hello World'"),
424 Ok(Key::Str("Hello World".to_owned()))
425 );
426 assert_eq!(
427 convert("X'1234'"),
428 Ok(Key::Bytea(hex::decode("1234").unwrap())),
429 );
430 assert!(matches!(convert("DATE '2022-03-03'"), Ok(Key::Date(_))));
431 assert!(matches!(convert("TIME '12:30:00'"), Ok(Key::Time(_))));
432 assert!(matches!(
433 convert("TIMESTAMP '2022-03-03 12:30:00Z'"),
434 Ok(Key::Timestamp(_))
435 ));
436 assert!(matches!(convert("INTERVAL '1' DAY"), Ok(Key::Interval(_))));
437 assert!(matches!(convert("GENERATE_UUID()"), Ok(Key::Uuid(_))));
438
439 assert_eq!(convert("NULL"), Ok(Key::None));
441
442 assert_eq!(
444 Key::try_from(Value::Map(BTreeMap::default())),
445 Err(KeyError::MapTypeKeyNotSupported.into())
446 );
447 assert_eq!(
448 Key::try_from(Value::List(Vec::default())),
449 Err(KeyError::ListTypeKeyNotSupported.into())
450 );
451 assert_eq!(
452 convert("SUBSTR('BEEF', 2, 3)"),
453 Ok(Key::Str("EEF".to_owned()))
454 );
455 assert_eq!(convert("POSITION('PORK' IN 'MEAT')"), Ok(Key::I64(0)));
456 assert_eq!(convert("FIND_IDX('Calzone', 'zone')"), Ok(Key::I64(4)));
457 assert_eq!(
458 convert("EXTRACT(SECOND FROM INTERVAL '8' SECOND)"),
459 Ok(Key::I64(8))
460 );
461 assert_eq!(
462 Key::try_from(Value::Point(Point::new(1.0, 2.0))),
463 Err(KeyError::PointTypeKeyNotSupported.into())
464 );
465 }
466
467 #[test]
468 fn cmp() {
469 use {
470 std::{net::IpAddr, str::FromStr},
471 uuid::Uuid,
472 };
473
474 let dec = |v| Decimal::from_str(v).unwrap();
475 let date = |y, m, d| NaiveDate::from_ymd_opt(y, m, d).unwrap();
476 let timestamp = |v| DateTime::from_timestamp_millis(v).unwrap().naive_utc();
477 let time = |h, m, s| NaiveTime::from_hms_milli_opt(h, m, s, 0).unwrap();
478 let uuid = |v| Uuid::parse_str(v).unwrap().as_u128();
479 let inet = |v| IpAddr::from_str(v).unwrap();
480
481 assert!(Key::I8(10) > Key::I8(3));
482 assert!(Key::I8(1) > Key::I16(1));
483
484 assert!(Key::I16(10) > Key::I16(3));
485 assert!(Key::I16(1) > Key::I32(1));
486
487 assert!(Key::I32(10) > Key::I32(3));
488 assert!(Key::I32(1) > Key::I64(1));
489
490 assert!(Key::I64(10) > Key::I64(3));
491 assert!(Key::I64(1) > Key::I128(1));
492
493 assert!(Key::I128(10) > Key::I128(3));
494 assert!(Key::I128(1) > Key::U8(1));
495
496 assert!(Key::U8(10) > Key::U8(3));
497 assert!(Key::U8(1) > Key::U16(1));
498
499 assert!(Key::U16(10) > Key::U16(3));
500 assert!(Key::U16(1) > Key::Decimal(dec("1")));
501
502 assert!(Key::U32(10) > Key::U32(3));
503 assert!(Key::U32(1) > Key::Decimal(dec("1")));
504
505 assert!(Key::U64(10) > Key::U64(3));
506 assert!(Key::U64(1) > Key::Decimal(dec("1")));
507
508 assert!(Key::U128(10) > Key::U128(3));
509 assert!(Key::U128(1) > Key::Decimal(dec("1")));
510
511 assert!(Key::F32(10.0_f32.into()) > Key::F32(3.0_f32.into()));
512 assert!(Key::F32(1.0_f32.into()) > Key::F64(1.0.into()));
513
514 assert!(Key::F64(10.0.into()) > Key::F64(3.0.into()));
515 assert!(Key::F64(1.0.into()) > Key::Decimal(dec("1")));
516
517 assert!(Key::Decimal(dec("123.45")) > Key::Decimal(dec("0.11")));
518 assert!(Key::Decimal(dec("1")) > Key::Bool(true));
519
520 assert!(Key::Bool(true) > Key::Bool(false));
521 assert!(Key::Bool(true) > Key::Str("zzz".to_owned()));
522
523 assert!(Key::Str("def".to_owned()) > Key::Str("abcd".to_owned()));
524 assert!(Key::Str("hi".to_owned()) > Key::Bytea(vec![101]));
525
526 assert!(Key::Bytea(vec![100]) > Key::Bytea(vec![3]));
527 assert!(Key::Bytea(vec![0]) > Key::Date(date(2023, 1, 1)));
528
529 assert!(Key::Date(date(2023, 3, 1)) > Key::Date(date(1999, 6, 11)));
530 assert!(Key::Date(date(2022, 6, 1)) > Key::Timestamp(timestamp(1_669_000_003)));
531
532 assert!(
533 Key::Timestamp(timestamp(1_662_921_288)) > Key::Timestamp(timestamp(1_661_000_000))
534 );
535 assert!(Key::Timestamp(timestamp(1_668_919_293)) > Key::Time(time(23, 1, 59)));
536
537 assert!(Key::Time(time(20, 1, 9)) > Key::Time(time(10, 0, 3)));
538 assert!(Key::Time(time(1, 2, 3)) > Key::Interval(Interval::Month(12)));
539
540 assert!(Key::Interval(Interval::Month(3)) > Key::Interval(Interval::Month(1)));
541 assert!(
542 Key::Interval(Interval::microseconds(1))
543 > Key::Uuid(uuid("dc98e386-a4d0-45c7-babe-b4238de4b139"))
544 );
545
546 assert!(
547 Key::Uuid(uuid("dc98e386-a4d0-45c7-babe-b4238de4b139"))
548 > Key::Uuid(uuid("550e8400-e29b-41d4-a716-446655440000"))
549 );
550 assert!(
551 Key::Uuid(uuid("dc98e386-a4d0-45c7-babe-b4238de4b139")) > Key::Inet(inet("127.0.0.1"))
552 );
553
554 assert!(Key::Inet(inet("127.0.0.1")) > Key::Inet(inet("0.0.0.1")));
555 assert!(Key::Inet(inet("192.168.1.19")) < Key::None);
556
557 assert_eq!(Key::None.partial_cmp(&Key::None), Some(Ordering::Equal));
558 assert!(Key::None > Key::I8(100));
559 }
560
561 #[test]
562 fn cmp_big_endian() {
563 use crate::data::{Interval as I, Key::*};
564
565 fn cmp(ls: &Result<Vec<u8>>, rs: &Result<Vec<u8>>) -> Ordering {
566 let ls = ls.as_ref().unwrap();
567 let rs = rs.as_ref().unwrap();
568
569 for (l, r) in ls.iter().zip(rs.iter()) {
570 match l.cmp(r) {
571 Ordering::Equal => {}
572 ordering => return ordering,
573 }
574 }
575
576 let size_l = ls.len();
577 let size_r = rs.len();
578
579 size_l.cmp(&size_r)
580 }
581
582 let null = None.to_cmp_be_bytes();
583
584 let n1 = Bool(true).to_cmp_be_bytes();
585 let n2 = Bool(false).to_cmp_be_bytes();
586
587 assert_eq!(cmp(&n2, &n2), Ordering::Equal);
588 assert_eq!(cmp(&n1, &n2), Ordering::Greater);
589 assert_eq!(cmp(&n2, &n1), Ordering::Less);
590 assert_eq!(cmp(&n1, &null), Ordering::Less);
591
592 let n1 = I8(-100).to_cmp_be_bytes();
593 let n2 = I8(-10).to_cmp_be_bytes();
594 let n3 = I8(0).to_cmp_be_bytes();
595 let n4 = I8(3).to_cmp_be_bytes();
596 let n5 = I8(20).to_cmp_be_bytes();
597 let n6 = I8(100).to_cmp_be_bytes();
598
599 assert_eq!(cmp(&n1, &n2), Ordering::Less);
600 assert_eq!(cmp(&n3, &n2), Ordering::Greater);
601 assert_eq!(cmp(&n1, &n6), Ordering::Less);
602 assert_eq!(cmp(&n5, &n5), Ordering::Equal);
603 assert_eq!(cmp(&n4, &n5), Ordering::Less);
604 assert_eq!(cmp(&n6, &n4), Ordering::Greater);
605 assert_eq!(cmp(&n4, &null), Ordering::Less);
606
607 let n1 = I16(-100).to_cmp_be_bytes();
608 let n2 = I16(-10).to_cmp_be_bytes();
609 let n3 = I16(0).to_cmp_be_bytes();
610 let n4 = I16(3).to_cmp_be_bytes();
611 let n5 = I16(20).to_cmp_be_bytes();
612 let n6 = I16(100).to_cmp_be_bytes();
613
614 assert_eq!(cmp(&n1, &n2), Ordering::Less);
615 assert_eq!(cmp(&n3, &n2), Ordering::Greater);
616 assert_eq!(cmp(&n1, &n6), Ordering::Less);
617 assert_eq!(cmp(&n5, &n5), Ordering::Equal);
618 assert_eq!(cmp(&n4, &n5), Ordering::Less);
619 assert_eq!(cmp(&n6, &n4), Ordering::Greater);
620 assert_eq!(cmp(&n4, &null), Ordering::Less);
621
622 let n1 = I32(-100).to_cmp_be_bytes();
623 let n2 = I32(-10).to_cmp_be_bytes();
624 let n3 = I32(0).to_cmp_be_bytes();
625 let n4 = I32(3).to_cmp_be_bytes();
626 let n5 = I32(20).to_cmp_be_bytes();
627 let n6 = I32(100).to_cmp_be_bytes();
628
629 assert_eq!(cmp(&n1, &n2), Ordering::Less);
630 assert_eq!(cmp(&n3, &n2), Ordering::Greater);
631 assert_eq!(cmp(&n1, &n6), Ordering::Less);
632 assert_eq!(cmp(&n5, &n5), Ordering::Equal);
633 assert_eq!(cmp(&n4, &n5), Ordering::Less);
634 assert_eq!(cmp(&n6, &n4), Ordering::Greater);
635 assert_eq!(cmp(&n4, &null), Ordering::Less);
636
637 let n1 = I64(-123).to_cmp_be_bytes();
638 let n2 = I64(-11).to_cmp_be_bytes();
639 let n3 = I64(0).to_cmp_be_bytes();
640 let n4 = I64(3).to_cmp_be_bytes();
641 let n5 = I64(20).to_cmp_be_bytes();
642 let n6 = I64(100).to_cmp_be_bytes();
643
644 assert_eq!(cmp(&n1, &n2), Ordering::Less);
645 assert_eq!(cmp(&n3, &n2), Ordering::Greater);
646 assert_eq!(cmp(&n1, &n6), Ordering::Less);
647 assert_eq!(cmp(&n5, &n5), Ordering::Equal);
648 assert_eq!(cmp(&n4, &n5), Ordering::Less);
649 assert_eq!(cmp(&n6, &n4), Ordering::Greater);
650 assert_eq!(cmp(&n4, &null), Ordering::Less);
651
652 let n1 = I128(-123).to_cmp_be_bytes();
653 let n2 = I128(-11).to_cmp_be_bytes();
654 let n3 = I128(0).to_cmp_be_bytes();
655 let n4 = I128(3).to_cmp_be_bytes();
656 let n5 = I128(20).to_cmp_be_bytes();
657 let n6 = I128(100).to_cmp_be_bytes();
658
659 assert_eq!(cmp(&n1, &n2), Ordering::Less);
660 assert_eq!(cmp(&n3, &n2), Ordering::Greater);
661 assert_eq!(cmp(&n1, &n6), Ordering::Less);
662 assert_eq!(cmp(&n5, &n5), Ordering::Equal);
663 assert_eq!(cmp(&n4, &n5), Ordering::Less);
664 assert_eq!(cmp(&n6, &n4), Ordering::Greater);
665 assert_eq!(cmp(&n4, &null), Ordering::Less);
666
667 let n1 = U8(0).to_cmp_be_bytes();
668 let n2 = U8(3).to_cmp_be_bytes();
669 let n3 = U8(20).to_cmp_be_bytes();
670 let n4 = U8(20).to_cmp_be_bytes();
671 assert_eq!(cmp(&n1, &n2), Ordering::Less);
672 assert_eq!(cmp(&n3, &n2), Ordering::Greater);
673 assert_eq!(cmp(&n1, &n4), Ordering::Less);
674 assert_eq!(cmp(&n3, &n4), Ordering::Equal);
675
676 let n1 = U16(0).to_cmp_be_bytes();
677 let n2 = U16(3).to_cmp_be_bytes();
678 let n3 = U16(20).to_cmp_be_bytes();
679 let n4 = U16(20).to_cmp_be_bytes();
680 assert_eq!(cmp(&n1, &n2), Ordering::Less);
681 assert_eq!(cmp(&n3, &n2), Ordering::Greater);
682 assert_eq!(cmp(&n1, &n4), Ordering::Less);
683 assert_eq!(cmp(&n3, &n4), Ordering::Equal);
684
685 let n1 = U32(0).to_cmp_be_bytes();
686 let n2 = U32(3).to_cmp_be_bytes();
687 let n3 = U32(20).to_cmp_be_bytes();
688 let n4 = U32(20).to_cmp_be_bytes();
689 assert_eq!(cmp(&n1, &n2), Ordering::Less);
690 assert_eq!(cmp(&n3, &n2), Ordering::Greater);
691 assert_eq!(cmp(&n1, &n4), Ordering::Less);
692 assert_eq!(cmp(&n3, &n4), Ordering::Equal);
693
694 let n1 = U64(0).to_cmp_be_bytes();
695 let n2 = U64(3).to_cmp_be_bytes();
696 let n3 = U64(20).to_cmp_be_bytes();
697 let n4 = U64(20).to_cmp_be_bytes();
698 assert_eq!(cmp(&n1, &n2), Ordering::Less);
699 assert_eq!(cmp(&n3, &n2), Ordering::Greater);
700 assert_eq!(cmp(&n1, &n4), Ordering::Less);
701 assert_eq!(cmp(&n3, &n4), Ordering::Equal);
702
703 let n1 = U128(0).to_cmp_be_bytes();
704 let n2 = U128(3).to_cmp_be_bytes();
705 let n3 = U128(20).to_cmp_be_bytes();
706 let n4 = U128(20).to_cmp_be_bytes();
707 assert_eq!(cmp(&n1, &n2), Ordering::Less);
708 assert_eq!(cmp(&n3, &n2), Ordering::Greater);
709 assert_eq!(cmp(&n1, &n4), Ordering::Less);
710 assert_eq!(cmp(&n3, &n4), Ordering::Equal);
711
712 let dec = |n| Decimal(rust_decimal::Decimal::from_str(n).unwrap());
713 let n1 = dec("-1200.345678").to_cmp_be_bytes();
714 let n2 = dec("-1.01").to_cmp_be_bytes();
715 let n3 = dec("0").to_cmp_be_bytes();
716 let n4 = dec("3.9").to_cmp_be_bytes();
717 let n5 = dec("300.0").to_cmp_be_bytes();
718 let n6 = dec("3000").to_cmp_be_bytes();
719 assert_eq!(cmp(&n1, &n2), Ordering::Less);
720 assert_eq!(cmp(&n3, &n2), Ordering::Greater);
721 assert_eq!(cmp(&n1, &n6), Ordering::Less);
722 assert_eq!(cmp(&n5, &n5), Ordering::Equal);
723 assert_eq!(cmp(&n4, &n5), Ordering::Less);
724 assert_eq!(cmp(&n6, &n4), Ordering::Greater);
725 assert_eq!(cmp(&n4, &null), Ordering::Less);
726
727 let n1 = Str("a".to_owned()).to_cmp_be_bytes();
728 let n2 = Str("ab".to_owned()).to_cmp_be_bytes();
729 let n3 = Str("aaa".to_owned()).to_cmp_be_bytes();
730 let n4 = Str("aaz".to_owned()).to_cmp_be_bytes();
731 let n5 = Str("c".to_owned()).to_cmp_be_bytes();
732
733 assert_eq!(cmp(&n2, &n2), Ordering::Equal);
734 assert_eq!(cmp(&n1, &n2), Ordering::Less);
735 assert_eq!(cmp(&n3, &n1), Ordering::Greater);
736 assert_eq!(cmp(&n2, &n3), Ordering::Greater);
737 assert_eq!(cmp(&n3, &n4), Ordering::Less);
738 assert_eq!(cmp(&n5, &n4), Ordering::Greater);
739 assert_eq!(cmp(&n1, &null), Ordering::Less);
740
741 let n1 = Bytea(n1.unwrap()).to_cmp_be_bytes();
742 let n2 = Bytea(n2.unwrap()).to_cmp_be_bytes();
743 let n3 = Bytea(n3.unwrap()).to_cmp_be_bytes();
744 let n4 = Bytea(n4.unwrap()).to_cmp_be_bytes();
745 let n5 = Bytea(n5.unwrap()).to_cmp_be_bytes();
746
747 assert_eq!(cmp(&n2, &n2), Ordering::Equal);
748 assert_eq!(cmp(&n1, &n2), Ordering::Less);
749 assert_eq!(cmp(&n3, &n1), Ordering::Greater);
750 assert_eq!(cmp(&n2, &n3), Ordering::Greater);
751 assert_eq!(cmp(&n3, &n4), Ordering::Less);
752 assert_eq!(cmp(&n5, &n4), Ordering::Greater);
753 assert_eq!(cmp(&n1, &null), Ordering::Less);
754
755 let n1 = Inet(IpAddr::from_str("192.168.0.1").unwrap()).to_cmp_be_bytes();
756 let n2 = Inet(IpAddr::from_str("127.0.0.1").unwrap()).to_cmp_be_bytes();
757 let n3 = Inet(IpAddr::from_str("10.0.0.1").unwrap()).to_cmp_be_bytes();
758 let n4 = Inet(IpAddr::from_str("0.0.0.0").unwrap()).to_cmp_be_bytes();
759 let n5 = Inet(IpAddr::from_str("0:0:0:0:0:0:0:1").unwrap()).to_cmp_be_bytes();
760 let n6 = Inet(IpAddr::from_str("::1").unwrap()).to_cmp_be_bytes();
761
762 assert_eq!(cmp(&n1, &n1), Ordering::Equal);
763 assert_eq!(cmp(&n2, &n1), Ordering::Less);
764 assert_eq!(cmp(&n2, &n3), Ordering::Greater);
765 assert_eq!(cmp(&n3, &n4), Ordering::Greater);
766 assert_eq!(cmp(&n1, &null), Ordering::Greater);
767 assert_eq!(cmp(&n5, &n6), Ordering::Equal);
768
769 let n1 = Date(NaiveDate::from_ymd_opt(2021, 1, 1).unwrap()).to_cmp_be_bytes();
770 let n2 = Date(NaiveDate::from_ymd_opt(1989, 3, 20).unwrap()).to_cmp_be_bytes();
771
772 assert_eq!(cmp(&n2, &n2), Ordering::Equal);
773 assert_eq!(cmp(&n1, &n2), Ordering::Greater);
774 assert_eq!(cmp(&n1, &null), Ordering::Less);
775
776 let n1 = Time(NaiveTime::from_hms_milli_opt(20, 1, 9, 100).unwrap()).to_cmp_be_bytes();
777 let n2 = Time(NaiveTime::from_hms_milli_opt(3, 10, 30, 0).unwrap()).to_cmp_be_bytes();
778
779 assert_eq!(cmp(&n2, &n2), Ordering::Equal);
780 assert_eq!(cmp(&n1, &n2), Ordering::Greater);
781 assert_eq!(cmp(&n1, &null), Ordering::Less);
782
783 let n1 = Timestamp(
784 NaiveDate::from_ymd_opt(2021, 1, 1)
785 .unwrap()
786 .and_hms_milli_opt(1, 2, 3, 0)
787 .unwrap(),
788 )
789 .to_cmp_be_bytes();
790 let n2 = Timestamp(
791 NaiveDate::from_ymd_opt(1989, 3, 20)
792 .unwrap()
793 .and_hms_milli_opt(10, 0, 0, 999)
794 .unwrap(),
795 )
796 .to_cmp_be_bytes();
797
798 assert_eq!(cmp(&n2, &n2), Ordering::Equal);
799 assert_eq!(cmp(&n1, &n2), Ordering::Greater);
800 assert_eq!(cmp(&n1, &null), Ordering::Less);
801
802 let n1 = Interval(I::Month(30)).to_cmp_be_bytes();
803 let n2 = Interval(I::Month(2)).to_cmp_be_bytes();
804 let n3 = Interval(I::Microsecond(1000)).to_cmp_be_bytes();
805 let n4 = Interval(I::Microsecond(30)).to_cmp_be_bytes();
806
807 assert_eq!(cmp(&n1, &n1), Ordering::Equal);
808 assert_eq!(cmp(&n2, &n1), Ordering::Less);
809 assert_eq!(cmp(&n2, &n3), Ordering::Greater);
810 assert_eq!(cmp(&n3, &n4), Ordering::Greater);
811 assert_eq!(cmp(&n1, &null), Ordering::Less);
812
813 let n1 = Uuid(100).to_cmp_be_bytes();
814 let n2 = Uuid(101).to_cmp_be_bytes();
815
816 assert_eq!(cmp(&n1, &n1), Ordering::Equal);
817 assert_eq!(cmp(&n1, &n2), Ordering::Less);
818 assert_eq!(cmp(&n2, &n1), Ordering::Greater);
819 assert_eq!(cmp(&n1, &null), Ordering::Less);
820
821 assert_eq!(
822 F64(12.34.into()).to_cmp_be_bytes(),
823 Err(KeyError::FloatToCmpBigEndianNotSupported.into())
824 );
825 }
826
827 #[test]
828 fn from_key_to_value() {
829 use {crate::data::Interval as I, uuid::Uuid};
830
831 assert_eq!(Value::from(Key::I8(2)), Value::I8(2));
832 assert_eq!(Value::from(Key::I16(4)), Value::I16(4));
833 assert_eq!(Value::from(Key::I32(8)), Value::I32(8));
834 assert_eq!(Value::from(Key::I64(16)), Value::I64(16));
835 assert_eq!(Value::from(Key::I128(32)), Value::I128(32));
836 assert_eq!(Value::from(Key::U8(64)), Value::U8(64));
837 assert_eq!(Value::from(Key::U16(128)), Value::U16(128));
838 assert_eq!(Value::from(Key::U32(128)), Value::U32(128));
839 assert_eq!(Value::from(Key::U64(128)), Value::U64(128));
840 assert_eq!(Value::from(Key::U128(128)), Value::U128(128));
841 assert_eq!(Value::from(Key::F32(1.0.into())), Value::F32(1.0_f32));
842 assert_eq!(Value::from(Key::F64(1.0.into())), Value::F64(1.0));
843 assert_eq!(
844 Value::from(Key::Decimal(Decimal::from_str("123.45").unwrap())),
845 Value::Decimal(Decimal::from_str("123.45").unwrap())
846 );
847 assert_eq!(Value::from(Key::Bool(true)), Value::Bool(true));
848 assert_eq!(
849 Value::from(Key::Str("abc".to_owned())),
850 Value::Str("abc".to_owned())
851 );
852 assert_eq!(Value::from(Key::Bytea(vec![])), Value::Bytea(vec![]));
853 assert_eq!(
854 Value::from(Key::Inet(IpAddr::from_str("::1").unwrap())),
855 Value::Inet(IpAddr::from_str("::1").unwrap())
856 );
857 assert_eq!(
858 Value::from(Key::Date(NaiveDate::from_ymd_opt(2023, 1, 23).unwrap())),
859 Value::Date(NaiveDate::from_ymd_opt(2023, 1, 23).unwrap())
860 );
861 assert_eq!(
862 Value::from(Key::Timestamp(
863 DateTime::from_timestamp_millis(1_662_921_288)
864 .unwrap()
865 .naive_utc()
866 )),
867 Value::Timestamp(
868 DateTime::from_timestamp_millis(1_662_921_288)
869 .unwrap()
870 .naive_utc()
871 )
872 );
873 assert_eq!(
874 Value::from(Key::Time(
875 NaiveTime::from_hms_milli_opt(20, 20, 1, 452).unwrap()
876 )),
877 Value::Time(NaiveTime::from_hms_milli_opt(20, 20, 1, 452).unwrap())
878 );
879 assert_eq!(
880 Value::from(Key::Interval(I::Month(11))),
881 Value::Interval(I::Month(11))
882 );
883 assert_eq!(
884 Value::from(Key::Uuid(
885 Uuid::parse_str("550e8400-e29b-41d4-a716-446655440000")
886 .unwrap()
887 .as_u128()
888 )),
889 Value::Uuid(
890 Uuid::parse_str("550e8400-e29b-41d4-a716-446655440000")
891 .unwrap()
892 .as_u128()
893 )
894 );
895 matches!(Value::from(Key::None), Value::Null);
896 }
897}