1#![deny(rust_2018_idioms)]
2#![deny(clippy::all)]
3
4mod bag;
5mod bindings;
6pub mod boxed_variant;
7pub mod comparison;
8mod datetime;
9pub mod datum;
10mod graph;
11mod list;
12mod pretty;
13mod sort;
14mod tuple;
15mod util;
16mod value;
17mod variant;
18
19pub use bag::*;
20pub use bindings::*;
21pub use comparison::*;
22pub use datetime::*;
23pub use graph::*;
24pub use list::*;
25pub use sort::*;
26pub use tuple::*;
27pub use value::*;
28pub use variant::*;
29
30#[cfg(test)]
31mod tests {
32 use super::*;
33 use crate::comparison::{EqualityValue, NullableEq, NullableOrd};
34 use crate::sort::NullSortedValue;
35 use ordered_float::OrderedFloat;
36 use rust_decimal::Decimal as RustDecimal;
37 use rust_decimal_macros::dec;
38 use std::borrow::Cow;
39 use std::cell::RefCell;
40 use std::cmp::Ordering;
41 use std::collections::HashSet;
42 use std::mem;
43 use std::rc::Rc;
44
45 #[test]
46 fn value_size() {
47 println!("bool size: {}", mem::size_of::<bool>());
48 println!("i64 size: {}", mem::size_of::<i64>());
49 println!(
50 "OrderedFloat<f64> size: {}",
51 mem::size_of::<OrderedFloat<f64>>()
52 );
53 println!("Decimal size: {}", mem::size_of::<RustDecimal>());
54 println!("String size: {}", mem::size_of::<String>());
55 println!("Bag size: {}", mem::size_of::<Bag>());
56 println!("List size: {}", mem::size_of::<List>());
57 println!("Tuple size: {}", mem::size_of::<Tuple>());
58 println!("Box<Tuple> size: {}", mem::size_of::<Box<Tuple>>());
59 println!("Rc<Tuple> size: {}", mem::size_of::<Rc<Tuple>>());
60 println!(
61 "Rc<RefCell<Tuple>> size: {}",
62 mem::size_of::<Rc<RefCell<Tuple>>>()
63 );
64 println!("Cow<&Tuple> size: {}", mem::size_of::<Cow<'_, &Tuple>>());
65 println!("Value size: {}", mem::size_of::<Value>());
66 println!("Option<Value> size: {}", mem::size_of::<Option<Value>>());
67 println!(
68 "Option<Option<Value>> size: {}",
69 mem::size_of::<Option<Option<Value>>>()
70 );
71 println!("Cow<'_, Value> size: {}", mem::size_of::<Cow<'_, Value>>());
72 println!("Cow<&Value> size: {}", mem::size_of::<Cow<'_, &Value>>());
73
74 assert_eq!(mem::size_of::<Value>(), 16);
75 assert_eq!(mem::size_of::<Option<Option<Value>>>(), 16);
76 }
77
78 #[test]
79 fn macro_rules_tests() {
80 println!("partiql_list:{:?}", list!());
81 println!("partiql_list:{:?}", list![10, 10]);
82 println!("partiql_list:{:?}", list!(5; 3));
83 println!("partiql_bag:{:?}", bag!());
84 println!("partiql_bag:{:?}", bag![10, 10]);
85 println!("partiql_bag:{:?}", bag!(5; 3));
86 println!("partiql_tuple:{:?}", tuple![]);
87 println!("partiql_tuple:{:?}", tuple![("a", 1), ("b", 2)]);
88 }
89
90 #[test]
91 fn iterators() {
92 let bag: Bag = [1, 10, 3, 4].into_iter().collect();
93 assert_eq!(bag.len(), 4);
94 let max = bag
95 .iter()
96 .fold(Value::Integer(0), |x, y| if y > &x { y.clone() } else { x });
97 assert_eq!(max, Value::Integer(10));
98 let _bref = Value::from(bag).as_bag_ref();
99
100 let list: List = [1, 2, 3, -4].into_iter().collect();
101 assert_eq!(list.len(), 4);
102 let max = list
103 .iter()
104 .fold(Value::Integer(0), |x, y| if y > &x { y.clone() } else { x });
105 assert_eq!(max, Value::Integer(3));
106 let _lref = Value::from(list).as_bag_ref();
107
108 let bag: Bag = [Value::from(5), "text".into(), true.into()]
109 .iter()
110 .map(Clone::clone)
111 .collect();
112 assert_eq!(bag.len(), 3);
113 let max = bag
114 .iter()
115 .fold(Value::Integer(0), |x, y| if y > &x { y.clone() } else { x });
116 assert_eq!(max, Value::String(Box::new("text".to_string())));
117
118 let list: List = [Value::from(5), Value::from(bag.clone()), true.into()]
119 .iter()
120 .map(Clone::clone)
121 .collect();
122 assert_eq!(list.len(), 3);
123 let max = list
124 .iter()
125 .fold(Value::Integer(0), |x, y| if y > &x { y.clone() } else { x });
126 assert_eq!(max, Value::from(bag.clone()));
127
128 let tuple: Tuple = [
129 ("list", Value::from(list.clone())),
130 ("bag", Value::from(bag.clone())),
131 ]
132 .iter()
133 .cloned()
134 .collect();
135
136 let mut pairs = tuple.pairs();
137 let list_val = Value::from(list);
138 assert_eq!(pairs.next(), Some((&"list".to_string(), &list_val)));
139 let bag_val = Value::from(bag);
140 assert_eq!(pairs.next(), Some((&"bag".to_string(), &bag_val)));
141 assert_eq!(pairs.next(), None);
142 }
143
144 #[test]
145 fn partiql_value_ordering() {
146 let mut vals = vec![
150 Value::Missing,
151 Value::from(false),
152 Value::from(true),
153 Value::from(f64::NAN),
154 Value::from(f64::NEG_INFINITY),
155 Value::from(-123.456),
156 Value::Decimal(Box::new(dec!(1.23456))),
157 Value::from(138u8),
158 Value::from(1348u16),
159 Value::from(13849u32),
160 Value::from(123_456),
161 Value::from(1_384_449_u64),
162 Value::from(138_444_339_u128),
163 Value::from(f64::INFINITY),
164 Value::from(""),
165 Value::from("abc"),
166 Value::Blob(Box::default()),
167 Value::Blob(Box::new(vec![1, 2, 3])),
168 Value::from(list!()),
169 Value::from(list!(1, 2, 3)),
170 Value::from(list!(1, 2, 3, 4, 5)),
171 Value::from(tuple!()),
172 Value::from(tuple![("a", 1), ("b", 2)]),
173 Value::from(tuple![("a", 1), ("b", 3)]),
174 Value::from(tuple![("a", 1), ("c", 2)]),
175 Value::from(bag!()),
176 Value::from(bag!(1, 2, 3)),
177 Value::from(bag!(3, 3, 3)),
178 ];
179 let expected_vals = vals.clone();
180 vals.reverse();
181 vals.sort();
182 assert_eq!(expected_vals, vals);
183 }
184
185 #[test]
186 fn partiql_value_arithmetic() {
187 assert_eq!(&Value::Missing, &Value::Missing.positive());
189 assert_eq!(&Value::Null, &Value::Null.positive());
190 assert_eq!(&Value::Integer(123), &Value::Integer(123).positive());
191 assert_eq!(
192 &Value::Decimal(Box::new(dec!(3))),
193 &Value::Decimal(Box::new(dec!(3))).positive()
194 );
195 assert_eq!(&Value::from(4.0), &Value::from(4.0).positive());
196 assert_eq!(&Value::Missing, &Value::from("foo").positive());
197
198 assert_eq!(Value::Missing, -&Value::Missing);
200 assert_eq!(Value::Null, -&Value::Null);
201 assert_eq!(Value::Integer(-123), -&Value::Integer(123));
202 assert_eq!(
203 Value::Decimal(Box::new(dec!(-3))),
204 -&Value::Decimal(Box::new(dec!(3)))
205 );
206 assert_eq!(Value::from(-4.0), -&Value::from(4.0));
207 assert_eq!(Value::Missing, -&Value::from("foo"));
208
209 assert_eq!(Value::Missing, &Value::Missing + &Value::Missing);
211 assert_eq!(Value::Missing, &Value::Missing + &Value::Null);
212 assert_eq!(Value::Missing, &Value::Null + &Value::Missing);
213 assert_eq!(Value::Null, &Value::Null + &Value::Null);
214 assert_eq!(Value::Missing, &Value::Integer(1) + &Value::from("a"));
215 assert_eq!(Value::Integer(3), &Value::Integer(1) + &Value::Integer(2));
216 assert_eq!(Value::from(4.0), &Value::from(1.5) + &Value::from(2.5));
217 assert_eq!(
218 Value::Decimal(Box::new(dec!(3))),
219 &Value::Decimal(Box::new(dec!(1))) + &Value::Decimal(Box::new(dec!(2)))
220 );
221 assert_eq!(Value::from(3.5), &Value::Integer(1) + &Value::from(2.5));
222 assert_eq!(Value::from(3.), &Value::from(1.) + &Value::from(2.));
223 assert_eq!(
224 Value::Decimal(Box::new(dec!(3))),
225 &Value::Integer(1) + &Value::Decimal(Box::new(dec!(2)))
226 );
227 assert_eq!(
228 Value::Decimal(Box::new(dec!(3))),
229 &Value::Decimal(Box::new(dec!(1))) + &Value::Integer(2)
230 );
231 assert_eq!(
232 Value::Decimal(Box::new(dec!(3))),
233 &Value::from(1.) + &Value::Decimal(Box::new(dec!(2)))
234 );
235 assert_eq!(
236 Value::Decimal(Box::new(dec!(3))),
237 &Value::Decimal(Box::new(dec!(1))) + &Value::from(2.)
238 );
239
240 assert_eq!(Value::Missing, &Value::Missing - &Value::Missing);
242 assert_eq!(Value::Missing, &Value::Missing - &Value::Null);
243 assert_eq!(Value::Missing, &Value::Null - &Value::Missing);
244 assert_eq!(Value::Null, &Value::Null - &Value::Null);
245 assert_eq!(Value::Missing, &Value::Integer(1) - &Value::from("a"));
246 assert_eq!(Value::Integer(-1), &Value::Integer(1) - &Value::Integer(2));
247 assert_eq!(Value::from(-1.0), &Value::from(1.5) - &Value::from(2.5));
248 assert_eq!(
249 Value::Decimal(Box::new(dec!(-1))),
250 &Value::Decimal(Box::new(dec!(1))) - &Value::Decimal(Box::new(dec!(2)))
251 );
252 assert_eq!(Value::from(-1.5), &Value::Integer(1) - &Value::from(2.5));
253 assert_eq!(Value::from(-1.), &Value::from(1.) - &Value::from(2.));
254 assert_eq!(
255 Value::Decimal(Box::new(dec!(-1))),
256 &Value::Integer(1) - &Value::Decimal(Box::new(dec!(2)))
257 );
258 assert_eq!(
259 Value::Decimal(Box::new(dec!(-1))),
260 &Value::Decimal(Box::new(dec!(1))) - &Value::Integer(2)
261 );
262 assert_eq!(
263 Value::Decimal(Box::new(dec!(-1))),
264 &Value::from(1.) - &Value::Decimal(Box::new(dec!(2)))
265 );
266 assert_eq!(
267 Value::Decimal(Box::new(dec!(-1))),
268 &Value::Decimal(Box::new(dec!(1))) - &Value::from(2.)
269 );
270
271 assert_eq!(Value::Missing, &Value::Missing * &Value::Missing);
273 assert_eq!(Value::Missing, &Value::Missing * &Value::Null);
274 assert_eq!(Value::Missing, &Value::Null * &Value::Missing);
275 assert_eq!(Value::Null, &Value::Null * &Value::Null);
276 assert_eq!(Value::Missing, &Value::Integer(1) * &Value::from("a"));
277 assert_eq!(Value::Integer(2), &Value::Integer(1) * &Value::Integer(2));
278 assert_eq!(Value::from(3.75), &Value::from(1.5) * &Value::from(2.5));
279 assert_eq!(
280 Value::from(RustDecimal::new(2, 0)),
281 &Value::Decimal(Box::new(dec!(1))) * &Value::from(dec!(2))
282 );
283 assert_eq!(Value::from(2.5), &Value::Integer(1) * &Value::from(2.5));
284 assert_eq!(Value::from(2.), &Value::from(1.) * &Value::from(2.));
285 assert_eq!(
286 Value::from(RustDecimal::new(2, 0)),
287 &Value::Integer(1) * &Value::Decimal(Box::new(dec!(2)))
288 );
289 assert_eq!(
290 Value::from(RustDecimal::new(2, 0)),
291 &Value::Decimal(Box::new(dec!(1))) * &Value::Integer(2)
292 );
293 assert_eq!(
294 Value::from(RustDecimal::new(2, 0)),
295 &Value::from(1.) * &Value::Decimal(Box::new(dec!(2)))
296 );
297 assert_eq!(
298 Value::from(RustDecimal::new(2, 0)),
299 &Value::Decimal(Box::new(dec!(1))) * &Value::from(2.)
300 );
301
302 assert_eq!(Value::Missing, &Value::Missing / &Value::Missing);
304 assert_eq!(Value::Missing, &Value::Missing / &Value::Null);
305 assert_eq!(Value::Missing, &Value::Null / &Value::Missing);
306 assert_eq!(Value::Null, &Value::Null / &Value::Null);
307 assert_eq!(Value::Missing, &Value::Integer(1) / &Value::from("a"));
308 assert_eq!(Value::Integer(0), &Value::Integer(1) / &Value::Integer(2));
309 assert_eq!(Value::from(0.6), &Value::from(1.5) / &Value::from(2.5));
310 assert_eq!(
311 Value::Decimal(Box::new(dec!(0.5))),
312 &Value::Decimal(Box::new(dec!(1))) / &Value::from(dec!(2))
313 );
314 assert_eq!(Value::from(0.4), &Value::Integer(1) / &Value::from(2.5));
315 assert_eq!(Value::from(0.5), &Value::from(1.) / &Value::from(2.));
316 assert_eq!(
317 Value::Decimal(Box::new(dec!(0.5))),
318 &Value::Integer(1) / &Value::Decimal(Box::new(dec!(2)))
319 );
320 assert_eq!(
321 Value::Decimal(Box::new(dec!(0.5))),
322 &Value::Decimal(Box::new(dec!(1))) / &Value::Integer(2)
323 );
324 assert_eq!(
325 Value::Decimal(Box::new(dec!(0.5))),
326 &Value::from(1.) / &Value::Decimal(Box::new(dec!(2)))
327 );
328 assert_eq!(
329 Value::Decimal(Box::new(dec!(0.5))),
330 &Value::Decimal(Box::new(dec!(1))) / &Value::from(2.)
331 );
332
333 assert_eq!(Value::Missing, &Value::Missing % &Value::Missing);
335 assert_eq!(Value::Missing, &Value::Missing % &Value::Null);
336 assert_eq!(Value::Missing, &Value::Null % &Value::Missing);
337 assert_eq!(Value::Null, &Value::Null % &Value::Null);
338 assert_eq!(Value::Missing, &Value::Integer(1) % &Value::from("a"));
339 assert_eq!(Value::Integer(1), &Value::Integer(1) % &Value::Integer(2));
340 assert_eq!(Value::from(1.5), &Value::from(1.5) % &Value::from(2.5));
341 assert_eq!(
342 Value::Decimal(Box::new(dec!(1))),
343 &Value::Decimal(Box::new(dec!(1))) % &Value::from(dec!(2))
344 );
345 assert_eq!(Value::from(1.), &Value::Integer(1) % &Value::from(2.5));
346 assert_eq!(Value::from(1.), &Value::from(1.) % &Value::from(2.));
347 assert_eq!(
348 Value::Decimal(Box::new(dec!(1))),
349 &Value::Integer(1) % &Value::Decimal(Box::new(dec!(2)))
350 );
351 assert_eq!(
352 Value::Decimal(Box::new(dec!(1))),
353 &Value::Decimal(Box::new(dec!(1))) % &Value::Integer(2)
354 );
355 assert_eq!(
356 Value::Decimal(Box::new(dec!(1))),
357 &Value::from(1.) % &Value::Decimal(Box::new(dec!(2)))
358 );
359 assert_eq!(
360 Value::Decimal(Box::new(dec!(1))),
361 &Value::Decimal(Box::new(dec!(1))) % &Value::from(2.)
362 );
363 }
364
365 #[test]
366 fn partiql_value_logical() {
367 assert_eq!(Value::Null, !&Value::Missing);
369 assert_eq!(Value::Null, !&Value::Null);
370 assert_eq!(Value::from(true), !&Value::from(false));
371 assert_eq!(Value::from(false), !&Value::from(true));
372 assert_eq!(Value::Missing, !&Value::from("foo"));
373
374 assert_eq!(
376 Value::from(false),
377 Value::from(false).and(&Value::from(true))
378 );
379 assert_eq!(
380 Value::from(false),
381 Value::from(true).and(&Value::from(false))
382 );
383 assert_eq!(Value::from(true), Value::from(true).and(&Value::from(true)));
384 assert_eq!(
385 Value::from(false),
386 Value::from(false).and(&Value::from(false))
387 );
388
389 assert_eq!(Value::from(false), Value::Null.and(&Value::from(false)));
391 assert_eq!(Value::from(false), Value::from(false).and(&Value::Null));
392 assert_eq!(Value::from(false), Value::Missing.and(&Value::from(false)));
393 assert_eq!(Value::from(false), Value::from(false).and(&Value::Missing));
394
395 assert_eq!(Value::Null, Value::Null.and(&Value::Null));
397 assert_eq!(Value::Null, Value::Missing.and(&Value::Missing));
398 assert_eq!(Value::Null, Value::Null.and(&Value::Missing));
399 assert_eq!(Value::Null, Value::Missing.and(&Value::Null));
400 assert_eq!(Value::Null, Value::Null.and(&Value::from(true)));
401 assert_eq!(Value::Null, Value::Missing.and(&Value::from(true)));
402 assert_eq!(Value::Null, Value::from(true).and(&Value::Null));
403 assert_eq!(Value::Null, Value::from(true).and(&Value::Missing));
404
405 assert_eq!(Value::Missing, Value::from(123).and(&Value::from(false)));
407 assert_eq!(Value::Missing, Value::from(false).and(&Value::from(123)));
408 assert_eq!(Value::Missing, Value::from(123).and(&Value::from(true)));
409 assert_eq!(Value::Missing, Value::from(true).and(&Value::from(123)));
410
411 assert_eq!(Value::from(true), Value::from(false).or(&Value::from(true)));
413 assert_eq!(Value::from(true), Value::from(true).or(&Value::from(false)));
414 assert_eq!(Value::from(true), Value::from(true).or(&Value::from(true)));
415 assert_eq!(
416 Value::from(false),
417 Value::from(false).or(&Value::from(false))
418 );
419
420 assert_eq!(Value::from(true), Value::Null.or(&Value::from(true)));
422 assert_eq!(Value::from(true), Value::from(true).or(&Value::Null));
423 assert_eq!(Value::from(true), Value::Missing.or(&Value::from(true)));
424 assert_eq!(Value::from(true), Value::from(true).or(&Value::Missing));
425
426 assert_eq!(Value::Null, Value::Null.or(&Value::Null));
428 assert_eq!(Value::Null, Value::Missing.or(&Value::Missing));
429 assert_eq!(Value::Null, Value::Null.or(&Value::Missing));
430 assert_eq!(Value::Null, Value::Missing.or(&Value::Null));
431 assert_eq!(Value::Null, Value::Null.or(&Value::from(false)));
432 assert_eq!(Value::Null, Value::Missing.or(&Value::from(false)));
433 assert_eq!(Value::Null, Value::from(false).or(&Value::Null));
434 assert_eq!(Value::Null, Value::from(false).or(&Value::Missing));
435
436 assert_eq!(Value::Missing, Value::from(123).or(&Value::from(false)));
438 assert_eq!(Value::Missing, Value::from(false).or(&Value::from(123)));
439 assert_eq!(Value::Missing, Value::from(123).or(&Value::from(true)));
440 assert_eq!(Value::Missing, Value::from(true).or(&Value::from(123)));
441 }
442
443 #[test]
444 fn partiql_value_equality() {
445 fn nullable_eq(lhs: Value, rhs: Value) -> Value {
449 let wrap = EqualityValue::<false, false, Value>;
450 let lhs = wrap(&lhs);
451 let rhs = wrap(&rhs);
452 NullableEq::eq(&lhs, &rhs)
453 }
454
455 fn nullable_neq(lhs: Value, rhs: Value) -> Value {
456 let wrap = EqualityValue::<false, false, Value>;
457 let lhs = wrap(&lhs);
458 let rhs = wrap(&rhs);
459 NullableEq::neq(&lhs, &rhs)
460 }
461
462 assert_eq!(
464 Value::from(true),
465 nullable_eq(Value::from(true), Value::from(true))
466 );
467 assert_eq!(
468 Value::from(false),
469 nullable_eq(Value::from(true), Value::from(false))
470 );
471 assert_eq!(
473 Value::from(true),
474 nullable_eq(Value::from(bag![3, 2, 4, 2]), Value::from(bag![2, 2, 3, 4]))
475 );
476 assert_eq!(
477 Value::from(true),
478 nullable_eq(
479 Value::from(tuple![("a", 1), ("b", 2)]),
480 Value::from(tuple![("a", 1), ("b", 2)])
481 )
482 );
483 assert_eq!(
484 Value::from(true),
485 nullable_eq(
486 Value::from(tuple![("a", list![0, 1]), ("b", 2)]),
487 Value::from(tuple![("a", list![0, 1]), ("b", 2)])
488 )
489 );
490 assert_eq!(
491 Value::from(false),
492 nullable_eq(Value::from(bag![3, 4, 2]), Value::from(bag![2, 2, 3, 4]))
493 );
494 assert_eq!(
495 Value::from(true),
496 nullable_eq(Value::from(list![1, 2]), Value::from(list![1e0, 2.0]))
497 );
498 assert_eq!(
499 Value::from(false),
500 nullable_eq(Value::from(list![1, 2]), Value::from(list![2.0, 1e0]))
501 );
502 assert_eq!(
503 Value::from(true),
504 nullable_eq(Value::from(bag![1, 2]), Value::from(bag![2.0, 1e0]))
505 );
506 assert_eq!(
507 Value::from(false),
508 nullable_eq(
509 Value::from(tuple![("a", 1), ("b", 2)]),
510 Value::from(tuple![("a", 1)])
511 )
512 );
513 assert_eq!(
514 Value::from(false),
515 nullable_eq(
516 Value::from(tuple![("a", list![0, 1]), ("b", 2)]),
517 Value::from(tuple![("a", list![0, 1, 2]), ("b", 2)])
518 )
519 );
520 assert_eq!(
521 Value::from(false),
522 nullable_eq(
523 Value::from(tuple![("a", 1), ("b", 2)]),
524 Value::from(tuple![("a", 1), ("b", Value::Null)])
525 )
526 );
527 assert_eq!(
528 Value::from(false),
529 nullable_eq(
530 Value::from(tuple![("a", list![0, 1]), ("b", 2)]),
531 Value::from(tuple![("a", list![Value::Null, 1]), ("b", 2)])
532 )
533 );
534 assert_eq!(Value::Null, nullable_eq(Value::from(true), Value::Null));
535 assert_eq!(Value::Null, nullable_eq(Value::Null, Value::from(true)));
536 assert_eq!(
537 Value::Missing,
538 nullable_eq(Value::from(true), Value::Missing)
539 );
540 assert_eq!(
541 Value::Missing,
542 nullable_eq(Value::Missing, Value::from(true))
543 );
544
545 assert_eq!(
547 Value::from(true),
548 nullable_eq(Value::from(1), Value::from(1.0))
549 );
550 assert_eq!(
551 Value::from(true),
552 nullable_eq(Value::from(1.0), Value::from(1))
553 );
554 assert_eq!(
555 Value::from(true),
556 nullable_eq(Value::from(1), Value::from(dec!(1.0)))
557 );
558 assert_eq!(
559 Value::from(true),
560 nullable_eq(Value::from(dec!(1.0)), Value::from(1))
561 );
562 assert_eq!(
563 Value::from(true),
564 nullable_eq(Value::from(1.0), Value::from(dec!(1.0)))
565 );
566 assert_eq!(
567 Value::from(true),
568 nullable_eq(Value::from(dec!(1.0)), Value::from(1.0))
569 );
570 assert_eq!(
572 Value::from(false),
573 nullable_eq(Value::from(1), Value::from(2.0))
574 );
575 assert_eq!(
576 Value::from(false),
577 nullable_eq(Value::from(1.0), Value::from(2))
578 );
579 assert_eq!(
580 Value::from(false),
581 nullable_eq(Value::from(1), Value::from(dec!(2.0)))
582 );
583 assert_eq!(
584 Value::from(false),
585 nullable_eq(Value::from(dec!(1.0)), Value::from(2))
586 );
587 assert_eq!(
588 Value::from(false),
589 nullable_eq(Value::from(1.0), Value::from(dec!(2.0)))
590 );
591 assert_eq!(
592 Value::from(false),
593 nullable_eq(Value::from(dec!(1.0)), Value::from(2.0))
594 );
595 assert_eq!(
596 Value::from(false),
597 nullable_eq(Value::from(1), Value::from(f64::NEG_INFINITY))
598 );
599 assert_eq!(
600 Value::from(false),
601 nullable_eq(Value::from(f64::NEG_INFINITY), Value::from(1))
602 );
603 assert_eq!(
605 Value::from(false),
606 nullable_eq(Value::from(true), Value::from("abc"))
607 );
608 assert_eq!(
609 Value::from(false),
610 nullable_eq(Value::from("abc"), Value::from(true))
611 );
612
613 assert_eq!(
615 Value::from(false),
616 nullable_neq(Value::from(true), Value::from(true))
617 );
618 assert_eq!(
619 Value::from(true),
620 nullable_neq(Value::from(true), Value::from(false))
621 );
622 assert_eq!(
625 Value::from(false),
626 nullable_neq(Value::from(bag![3, 2, 4, 2]), Value::from(bag![2, 2, 3, 4]))
627 );
628 assert_eq!(
629 Value::from(false),
630 nullable_neq(
631 Value::from(tuple![("a", 1), ("b", 2)]),
632 Value::from(tuple![("a", 1), ("b", 2)])
633 )
634 );
635 assert_eq!(
636 Value::from(false),
637 nullable_neq(
638 Value::from(tuple![("a", list![0, 1]), ("b", 2)]),
639 Value::from(tuple![("a", list![0, 1]), ("b", 2)])
640 )
641 );
642 assert_eq!(
643 Value::from(true),
644 nullable_neq(Value::from(bag![3, 4, 2]), Value::from(bag![2, 2, 3, 4]))
645 );
646 assert_eq!(
647 Value::from(true),
648 nullable_neq(
649 Value::from(tuple![("a", 1), ("b", 2)]),
650 Value::from(tuple![("a", 1)])
651 )
652 );
653 assert_eq!(
654 Value::from(true),
655 nullable_neq(
656 Value::from(tuple![("a", list![0, 1]), ("b", 2)]),
657 Value::from(tuple![("a", list![0, 1, 2]), ("b", 2)])
658 )
659 );
660 assert_eq!(
661 Value::from(true),
662 nullable_neq(
663 Value::from(tuple![("a", 1), ("b", 2)]),
664 Value::from(tuple![("a", 1), ("b", Value::Null)])
665 )
666 );
667 assert_eq!(
668 Value::from(true),
669 nullable_neq(
670 Value::from(tuple![("a", list![0, 1]), ("b", 2)]),
671 Value::from(tuple![("a", list![Value::Null, 1]), ("b", 2)])
672 )
673 );
674 assert_eq!(Value::Null, nullable_neq(Value::from(true), Value::Null));
675 assert_eq!(Value::Null, nullable_neq(Value::Null, Value::from(true)));
676 assert_eq!(
677 Value::Missing,
678 nullable_neq(Value::from(true), Value::Missing)
679 );
680 assert_eq!(
681 Value::Missing,
682 nullable_neq(Value::Missing, Value::from(true))
683 );
684
685 assert_eq!(
687 Value::from(true),
688 nullable_neq(Value::from(1), Value::from(2.0))
689 );
690 assert_eq!(
691 Value::from(true),
692 nullable_neq(Value::from(1.0), Value::from(2))
693 );
694 assert_eq!(
695 Value::from(true),
696 nullable_neq(Value::from(1), Value::from(dec!(2.0)))
697 );
698 assert_eq!(
699 Value::from(true),
700 nullable_neq(Value::from(dec!(1.0)), Value::from(2))
701 );
702 assert_eq!(
703 Value::from(true),
704 nullable_neq(Value::from(1.0), Value::from(dec!(2.0)))
705 );
706 assert_eq!(
707 Value::from(true),
708 nullable_neq(Value::from(dec!(1.0)), Value::from(2.0))
709 );
710 assert_eq!(
711 Value::from(true),
712 nullable_neq(Value::from(1), Value::from(f64::NEG_INFINITY))
713 );
714 assert_eq!(
715 Value::from(true),
716 nullable_neq(Value::from(f64::NEG_INFINITY), Value::from(1))
717 );
718 assert_eq!(
720 Value::from(false),
721 nullable_neq(Value::from(1), Value::from(1.0))
722 );
723 assert_eq!(
724 Value::from(false),
725 nullable_neq(Value::from(1.0), Value::from(1))
726 );
727 assert_eq!(
728 Value::from(false),
729 nullable_neq(Value::from(1), Value::from(dec!(1.0)))
730 );
731 assert_eq!(
732 Value::from(false),
733 nullable_neq(Value::from(dec!(1.0)), Value::from(1))
734 );
735 assert_eq!(
736 Value::from(false),
737 nullable_neq(Value::from(1.0), Value::from(dec!(1.0)))
738 );
739 assert_eq!(
740 Value::from(false),
741 nullable_neq(Value::from(dec!(1.0)), Value::from(1.0))
742 );
743 assert_eq!(
745 Value::from(true),
746 nullable_neq(Value::from(true), Value::from("abc"))
747 );
748 assert_eq!(
749 Value::from(true),
750 nullable_neq(Value::from("abc"), Value::from(true))
751 );
752 }
753
754 #[test]
755 fn partiql_value_comparison() {
756 assert_eq!(
758 Value::from(true),
759 NullableOrd::lt(&Value::from(1), &Value::from(2))
760 );
761 assert_eq!(
762 Value::from(false),
763 NullableOrd::lt(&Value::from(1), &Value::from(0))
764 );
765 assert_eq!(
766 Value::from(false),
767 NullableOrd::lt(&Value::from(1), &Value::from(1))
768 );
769
770 assert_eq!(
772 Value::from(false),
773 NullableOrd::gt(&Value::from(1), &Value::from(2))
774 );
775 assert_eq!(
776 Value::from(true),
777 NullableOrd::gt(&Value::from(1), &Value::from(0))
778 );
779 assert_eq!(
780 Value::from(false),
781 NullableOrd::gt(&Value::from(1), &Value::from(1))
782 );
783
784 assert_eq!(
786 Value::from(true),
787 NullableOrd::lteq(&Value::from(1), &Value::from(2))
788 );
789 assert_eq!(
790 Value::from(false),
791 NullableOrd::lteq(&Value::from(1), &Value::from(0))
792 );
793 assert_eq!(
794 Value::from(true),
795 NullableOrd::lteq(&Value::from(1), &Value::from(1))
796 );
797
798 assert_eq!(
800 Value::from(false),
801 NullableOrd::gteq(&Value::from(1), &Value::from(2))
802 );
803 assert_eq!(
804 Value::from(true),
805 NullableOrd::gteq(&Value::from(1), &Value::from(0))
806 );
807 assert_eq!(
808 Value::from(true),
809 NullableOrd::gteq(&Value::from(1), &Value::from(1))
810 );
811
812 assert_eq!(
814 Value::Missing,
815 NullableOrd::lt(&Value::Missing, &Value::from(2))
816 );
817 assert_eq!(
818 Value::Missing,
819 NullableOrd::lt(&Value::from(1), &Value::Missing)
820 );
821 assert_eq!(
822 Value::Missing,
823 NullableOrd::lt(&Value::Null, &Value::Missing)
824 );
825 assert_eq!(
826 Value::Missing,
827 NullableOrd::lt(&Value::Missing, &Value::Null)
828 );
829 assert_eq!(
830 Value::Missing,
831 NullableOrd::gt(&Value::Missing, &Value::from(2))
832 );
833 assert_eq!(
834 Value::Missing,
835 NullableOrd::gt(&Value::from(1), &Value::Missing)
836 );
837 assert_eq!(
838 Value::Missing,
839 NullableOrd::gt(&Value::Null, &Value::Missing)
840 );
841 assert_eq!(
842 Value::Missing,
843 NullableOrd::gt(&Value::Missing, &Value::Null)
844 );
845 assert_eq!(
846 Value::Missing,
847 NullableOrd::lteq(&Value::Missing, &Value::from(2))
848 );
849 assert_eq!(
850 Value::Missing,
851 NullableOrd::lteq(&Value::from(1), &Value::Missing)
852 );
853 assert_eq!(
854 Value::Missing,
855 NullableOrd::lteq(&Value::Null, &Value::Missing)
856 );
857 assert_eq!(
858 Value::Missing,
859 NullableOrd::lteq(&Value::Missing, &Value::Null)
860 );
861 assert_eq!(
862 Value::Missing,
863 NullableOrd::gteq(&Value::Missing, &Value::from(2))
864 );
865 assert_eq!(
866 Value::Missing,
867 NullableOrd::gteq(&Value::from(1), &Value::Missing)
868 );
869 assert_eq!(
870 Value::Missing,
871 NullableOrd::gteq(&Value::Null, &Value::Missing)
872 );
873 assert_eq!(
874 Value::Missing,
875 NullableOrd::gteq(&Value::Missing, &Value::Null)
876 );
877
878 assert_eq!(Value::Null, NullableOrd::lt(&Value::Null, &Value::from(2)));
880 assert_eq!(Value::Null, NullableOrd::lt(&Value::from(1), &Value::Null));
881 assert_eq!(Value::Null, NullableOrd::gt(&Value::Null, &Value::from(2)));
882 assert_eq!(Value::Null, NullableOrd::gt(&Value::from(1), &Value::Null));
883 assert_eq!(
884 Value::Null,
885 NullableOrd::lteq(&Value::Null, &Value::from(2))
886 );
887 assert_eq!(
888 Value::Null,
889 NullableOrd::lteq(&Value::from(1), &Value::Null)
890 );
891 assert_eq!(
892 Value::Null,
893 NullableOrd::gteq(&Value::Null, &Value::from(2))
894 );
895 assert_eq!(
896 Value::Null,
897 NullableOrd::gteq(&Value::from(1), &Value::Null)
898 );
899
900 assert_eq!(
902 Value::Missing,
903 NullableOrd::lt(&Value::from(1), &Value::from("abc"))
904 );
905 assert_eq!(
906 Value::Missing,
907 NullableOrd::lt(&Value::from("abc"), &Value::from(1))
908 );
909 assert_eq!(
910 Value::Missing,
911 NullableOrd::gt(&Value::from(1), &Value::from("abc"))
912 );
913 assert_eq!(
914 Value::Missing,
915 NullableOrd::gt(&Value::from("abc"), &Value::from(1))
916 );
917 assert_eq!(
918 Value::Missing,
919 NullableOrd::lteq(&Value::from(1), &Value::from("abc"))
920 );
921 assert_eq!(
922 Value::Missing,
923 NullableOrd::lteq(&Value::from("abc"), &Value::from(1))
924 );
925 assert_eq!(
926 Value::Missing,
927 NullableOrd::gteq(&Value::from(1), &Value::from("abc"))
928 );
929 assert_eq!(
930 Value::Missing,
931 NullableOrd::gteq(&Value::from("abc"), &Value::from(1))
932 );
933
934 assert_eq!(
937 Value::from(true),
938 NullableOrd::lt(&Value::from(1), &Value::from(2.0))
939 );
940 assert_eq!(
941 Value::from(true),
942 NullableOrd::lt(&Value::from(1), &Value::Decimal(Box::new(dec!(2.0))))
943 );
944 assert_eq!(
945 Value::from(true),
946 NullableOrd::lt(&Value::from(1.0), &Value::from(2))
947 );
948 assert_eq!(
949 Value::from(true),
950 NullableOrd::lt(&Value::from(1.0), &Value::Decimal(Box::new(dec!(2.0))))
951 );
952 assert_eq!(
953 Value::from(true),
954 NullableOrd::lt(&Value::Decimal(Box::new(dec!(1.0))), &Value::from(2))
955 );
956 assert_eq!(
957 Value::from(true),
958 NullableOrd::lt(&Value::Decimal(Box::new(dec!(1.0))), &Value::from(2.))
959 );
960
961 assert_eq!(
963 Value::from(false),
964 NullableOrd::gt(&Value::from(1), &Value::from(2.0))
965 );
966 assert_eq!(
967 Value::from(false),
968 NullableOrd::gt(&Value::from(1), &Value::Decimal(Box::new(dec!(2.0))))
969 );
970 assert_eq!(
971 Value::from(false),
972 NullableOrd::gt(&Value::from(1.0), &Value::from(2))
973 );
974 assert_eq!(
975 Value::from(false),
976 NullableOrd::gt(&Value::from(1.0), &Value::Decimal(Box::new(dec!(2.0))))
977 );
978 assert_eq!(
979 Value::from(false),
980 NullableOrd::gt(&Value::Decimal(Box::new(dec!(1.0))), &Value::from(2))
981 );
982 assert_eq!(
983 Value::from(false),
984 NullableOrd::gt(&Value::Decimal(Box::new(dec!(1.0))), &Value::from(2.))
985 );
986
987 assert_eq!(
989 Value::from(true),
990 NullableOrd::lteq(&Value::from(1), &Value::from(2.0))
991 );
992 assert_eq!(
993 Value::from(true),
994 NullableOrd::lteq(&Value::from(1), &Value::Decimal(Box::new(dec!(2.0))))
995 );
996 assert_eq!(
997 Value::from(true),
998 NullableOrd::lteq(&Value::from(1.0), &Value::from(2))
999 );
1000 assert_eq!(
1001 Value::from(true),
1002 NullableOrd::lteq(&Value::from(1.0), &Value::Decimal(Box::new(dec!(2.0))))
1003 );
1004 assert_eq!(
1005 Value::from(true),
1006 NullableOrd::lteq(&Value::Decimal(Box::new(dec!(1.0))), &Value::from(2))
1007 );
1008 assert_eq!(
1009 Value::from(true),
1010 NullableOrd::lteq(&Value::Decimal(Box::new(dec!(1.0))), &Value::from(2.))
1011 );
1012
1013 assert_eq!(
1015 Value::from(false),
1016 NullableOrd::gteq(&Value::from(1), &Value::from(2.0))
1017 );
1018 assert_eq!(
1019 Value::from(false),
1020 NullableOrd::gteq(&Value::from(1), &Value::Decimal(Box::new(dec!(2.0))))
1021 );
1022 assert_eq!(
1023 Value::from(false),
1024 NullableOrd::gteq(&Value::from(1.0), &Value::from(2))
1025 );
1026 assert_eq!(
1027 Value::from(false),
1028 NullableOrd::gteq(&Value::from(1.0), &Value::Decimal(Box::new(dec!(2.0))))
1029 );
1030 assert_eq!(
1031 Value::from(false),
1032 NullableOrd::gteq(&Value::Decimal(Box::new(dec!(1.0))), &Value::from(2))
1033 );
1034 assert_eq!(
1035 Value::from(false),
1036 NullableOrd::gteq(&Value::Decimal(Box::new(dec!(1.0))), &Value::from(2.))
1037 );
1038 }
1039
1040 #[test]
1041 fn tuple_concat() {
1042 let lhs = Tuple::from([("a", 1), ("b", 2), ("c", 3), ("d", 44)]);
1043 let rhs = Tuple::from([("a", 11), ("b", 22), ("c", 33), ("e", 55)]);
1044 assert_eq!(
1045 Tuple::from([("a", 11), ("b", 22), ("c", 33), ("d", 44), ("e", 55)]),
1046 lhs.tuple_concat(&rhs)
1047 );
1048 }
1049
1050 #[test]
1051 fn tuple_get() {
1052 let tuple = Tuple::from([("a", 1), ("A", 2), ("a", 3), ("A", 4)]);
1053 assert_eq!(
1055 Some(&Value::from(1)),
1056 tuple.get(&BindingsName::CaseSensitive(Cow::Owned("a".to_string())))
1057 );
1058 assert_eq!(
1059 Some(&Value::from(2)),
1060 tuple.get(&BindingsName::CaseSensitive(Cow::Owned("A".to_string())))
1061 );
1062 assert_eq!(
1064 Some(&Value::from(1)),
1065 tuple.get(&BindingsName::CaseInsensitive(Cow::Owned("a".to_string())))
1066 );
1067 assert_eq!(
1068 Some(&Value::from(1)),
1069 tuple.get(&BindingsName::CaseInsensitive(Cow::Owned("A".to_string())))
1070 );
1071 }
1072
1073 #[test]
1074 fn tuple_remove() {
1075 let mut tuple = Tuple::from([("a", 1), ("A", 2), ("a", 3), ("A", 4)]);
1076 assert_eq!(
1078 Some(Value::from(2)),
1079 tuple.remove(&BindingsName::CaseSensitive(Cow::Owned("A".to_string())))
1080 );
1081 assert_eq!(
1082 Some(Value::from(1)),
1083 tuple.remove(&BindingsName::CaseSensitive(Cow::Owned("a".to_string())))
1084 );
1085 assert_eq!(
1087 Some(Value::from(3)),
1088 tuple.remove(&BindingsName::CaseInsensitive(Cow::Owned("A".to_string())))
1089 );
1090 assert_eq!(
1091 Some(Value::from(4)),
1092 tuple.remove(&BindingsName::CaseInsensitive(Cow::Owned("a".to_string())))
1093 );
1094 }
1095
1096 #[test]
1097 fn bag_of_tuple_equality() {
1098 let bag1 = bag!(tuple![
1115 ("outer_elem_1", 1),
1116 (
1117 "outer_elem_2",
1118 bag![tuple![
1119 ("inner_elem_1", tuple![("bar", 3)]),
1120 ("inner_elem_2", tuple![("foo", 4)])
1121 ]]
1122 )
1123 ]);
1124 let bag2 = bag!(tuple![
1125 (
1126 "outer_elem_2",
1127 bag![tuple![
1128 ("inner_elem_2", tuple![("foo", 4)]),
1129 ("inner_elem_1", tuple![("bar", 3)])
1130 ]]
1131 ),
1132 ("outer_elem_1", 1)
1133 ]);
1134 assert_eq!(bag1, bag2);
1135 }
1136
1137 #[test]
1138 fn duplicate_tuple_elems() {
1139 let tuple1 = tuple![("a", 1), ("a", 1), ("b", 2)];
1140 let tuple2 = tuple![("a", 1), ("b", 2)];
1141 assert_ne!(tuple1, tuple2);
1142 }
1143
1144 #[test]
1145 fn tuple_hashing() {
1146 let tuple1 = tuple![("a", 1), ("b", 2)];
1147 let mut s: HashSet<Tuple> = HashSet::from([tuple1]);
1148 assert_eq!(1, s.len());
1149 let tuple2 = tuple![("b", 2), ("a", 1)];
1150 s.insert(tuple2);
1151 assert_eq!(1, s.len());
1152 }
1153
1154 #[test]
1155 fn null_sorted_value_ord_simple_nulls_first() {
1156 let v1 = Value::Missing;
1157 let v2 = Value::Boolean(true);
1158 let null_sorted_v1 = NullSortedValue::<true, Value>(&v1);
1159 let null_sorted_v2 = NullSortedValue::<true, Value>(&v2);
1160 assert_eq!(Ordering::Less, null_sorted_v1.cmp(&null_sorted_v2));
1161
1162 let v3 = Value::Null;
1163 let null_sorted_v3 = NullSortedValue::<true, Value>(&v3);
1164 assert_eq!(Ordering::Less, null_sorted_v3.cmp(&null_sorted_v2));
1165 assert_eq!(Ordering::Equal, null_sorted_v1.cmp(&null_sorted_v3));
1166 }
1167
1168 #[test]
1169 fn null_sorted_value_ord_simple_nulls_last() {
1170 let v1 = Value::Missing;
1171 let v2 = Value::Boolean(true);
1172 let null_sorted_v1 = NullSortedValue::<false, Value>(&v1);
1173 let null_sorted_v2 = NullSortedValue::<false, Value>(&v2);
1174 assert_eq!(Ordering::Greater, null_sorted_v1.cmp(&null_sorted_v2));
1175
1176 let v3 = Value::Null;
1177 let null_sorted_v3 = NullSortedValue::<false, Value>(&v3);
1178 assert_eq!(Ordering::Greater, null_sorted_v3.cmp(&null_sorted_v2));
1179 assert_eq!(Ordering::Equal, null_sorted_v1.cmp(&null_sorted_v3));
1180 }
1181
1182 #[test]
1183 fn null_sorted_value_ord_collection_nulls_first() {
1184 let v1 = list![Value::Missing].into();
1186 let v2 = list![Value::Boolean(true)].into();
1187 let null_sorted_v1 = NullSortedValue::<true, Value>(&v1);
1188 let null_sorted_v2 = NullSortedValue::<true, Value>(&v2);
1189 assert_eq!(Ordering::Less, null_sorted_v1.cmp(&null_sorted_v2));
1190
1191 let v3 = list![Value::Null].into();
1192 let null_sorted_v3 = NullSortedValue::<true, Value>(&v3);
1193 assert_eq!(Ordering::Less, null_sorted_v3.cmp(&null_sorted_v2));
1194 assert_eq!(Ordering::Equal, null_sorted_v1.cmp(&null_sorted_v3));
1195
1196 let v1 = bag![Value::Missing].into();
1198 let v2 = bag![Value::Boolean(true)].into();
1199 let null_sorted_v1 = NullSortedValue::<true, Value>(&v1);
1200 let null_sorted_v2 = NullSortedValue::<true, Value>(&v2);
1201 assert_eq!(Ordering::Less, null_sorted_v1.cmp(&null_sorted_v2));
1202
1203 let v3 = bag![Value::Null].into();
1204 let null_sorted_v3 = NullSortedValue::<true, Value>(&v3);
1205 assert_eq!(Ordering::Less, null_sorted_v3.cmp(&null_sorted_v2));
1206 assert_eq!(Ordering::Equal, null_sorted_v1.cmp(&null_sorted_v3));
1207
1208 let v1 = tuple![("a", Value::Missing)].into();
1210 let v2 = tuple![("a", Value::Boolean(true))].into();
1211 let null_sorted_v1 = NullSortedValue::<true, Value>(&v1);
1212 let null_sorted_v2 = NullSortedValue::<true, Value>(&v2);
1213 assert_eq!(Ordering::Less, null_sorted_v1.cmp(&null_sorted_v2));
1214
1215 let v3 = tuple![("a", Value::Null)].into();
1216 let null_sorted_v3 = NullSortedValue::<true, Value>(&v3);
1217 assert_eq!(Ordering::Less, null_sorted_v3.cmp(&null_sorted_v2));
1218 assert_eq!(Ordering::Equal, null_sorted_v1.cmp(&null_sorted_v3));
1219 }
1220
1221 #[test]
1222 fn null_sorted_value_ord_collection_nulls_last() {
1223 let v1 = list![Value::Missing].into();
1225 let v2 = list![Value::Boolean(true)].into();
1226 let null_sorted_v1 = NullSortedValue::<false, Value>(&v1);
1227 let null_sorted_v2 = NullSortedValue::<false, Value>(&v2);
1228 assert_eq!(Ordering::Greater, null_sorted_v1.cmp(&null_sorted_v2));
1229
1230 let v3 = list![Value::Null].into();
1231 let null_sorted_v3 = NullSortedValue::<false, Value>(&v3);
1232 assert_eq!(Ordering::Greater, null_sorted_v3.cmp(&null_sorted_v2));
1233 assert_eq!(Ordering::Equal, null_sorted_v1.cmp(&null_sorted_v3));
1234
1235 let v1 = bag![Value::Missing].into();
1237 let v2 = bag![Value::Boolean(true)].into();
1238 let null_sorted_v1 = NullSortedValue::<false, Value>(&v1);
1239 let null_sorted_v2 = NullSortedValue::<false, Value>(&v2);
1240 assert_eq!(Ordering::Greater, null_sorted_v1.cmp(&null_sorted_v2));
1241
1242 let v3 = bag![Value::Null].into();
1243 let null_sorted_v3 = NullSortedValue::<false, Value>(&v3);
1244 assert_eq!(Ordering::Greater, null_sorted_v3.cmp(&null_sorted_v2));
1245 assert_eq!(Ordering::Equal, null_sorted_v1.cmp(&null_sorted_v3));
1246
1247 let v1 = tuple![("a", Value::Missing)].into();
1249 let v2 = tuple![("a", Value::Boolean(true))].into();
1250 let null_sorted_v1 = NullSortedValue::<false, Value>(&v1);
1251 let null_sorted_v2 = NullSortedValue::<false, Value>(&v2);
1252 assert_eq!(Ordering::Greater, null_sorted_v1.cmp(&null_sorted_v2));
1253
1254 let v3 = tuple![("a", Value::Null)].into();
1255 let null_sorted_v3 = NullSortedValue::<false, Value>(&v3);
1256 assert_eq!(Ordering::Greater, null_sorted_v3.cmp(&null_sorted_v2));
1257 assert_eq!(Ordering::Equal, null_sorted_v1.cmp(&null_sorted_v3));
1258 }
1259}