1use reifydb_type::{IdentityId, OrderedF32, OrderedF64, Type, Uuid4, Uuid7, Value};
5
6use crate::value::encoded::{EncodedValues, EncodedValuesLayout};
7
8impl EncodedValuesLayout {
9 pub fn set_values(&self, row: &mut EncodedValues, values: &[Value]) {
10 debug_assert!(values.len() == self.fields.len());
11 for (idx, value) in values.iter().enumerate() {
12 self.set_value(row, idx, value)
13 }
14 }
15
16 pub fn set_value(&self, row: &mut EncodedValues, index: usize, val: &Value) {
17 let field = &self.fields[index];
18 debug_assert!(row.len() >= self.total_static_size());
19
20 match (field.r#type, val) {
21 (Type::Boolean, Value::Boolean(v)) => self.set_bool(row, index, *v),
22 (Type::Boolean, Value::Undefined) => self.set_undefined(row, index),
23
24 (Type::Float4, Value::Float4(v)) => self.set_f32(row, index, v.value()),
25 (Type::Float4, Value::Undefined) => self.set_undefined(row, index),
26
27 (Type::Float8, Value::Float8(v)) => self.set_f64(row, index, v.value()),
28 (Type::Float8, Value::Undefined) => self.set_undefined(row, index),
29
30 (Type::Int1, Value::Int1(v)) => self.set_i8(row, index, *v),
31 (Type::Int1, Value::Undefined) => self.set_undefined(row, index),
32
33 (Type::Int2, Value::Int2(v)) => self.set_i16(row, index, *v),
34 (Type::Int2, Value::Undefined) => self.set_undefined(row, index),
35
36 (Type::Int4, Value::Int4(v)) => self.set_i32(row, index, *v),
37 (Type::Int4, Value::Undefined) => self.set_undefined(row, index),
38
39 (Type::Int8, Value::Int8(v)) => self.set_i64(row, index, *v),
40 (Type::Int8, Value::Undefined) => self.set_undefined(row, index),
41
42 (Type::Int16, Value::Int16(v)) => self.set_i128(row, index, *v),
43 (Type::Int16, Value::Undefined) => self.set_undefined(row, index),
44
45 (Type::Utf8, Value::Utf8(v)) => self.set_utf8(row, index, v),
46 (Type::Utf8, Value::Undefined) => self.set_undefined(row, index),
47
48 (Type::Uint1, Value::Uint1(v)) => self.set_u8(row, index, *v),
49 (Type::Uint1, Value::Undefined) => self.set_undefined(row, index),
50
51 (Type::Uint2, Value::Uint2(v)) => self.set_u16(row, index, *v),
52 (Type::Uint2, Value::Undefined) => self.set_undefined(row, index),
53
54 (Type::Uint4, Value::Uint4(v)) => self.set_u32(row, index, *v),
55 (Type::Uint4, Value::Undefined) => self.set_undefined(row, index),
56
57 (Type::Uint8, Value::Uint8(v)) => self.set_u64(row, index, *v),
58 (Type::Uint8, Value::Undefined) => self.set_undefined(row, index),
59
60 (Type::Uint16, Value::Uint16(v)) => self.set_u128(row, index, *v),
61 (Type::Uint16, Value::Undefined) => self.set_undefined(row, index),
62
63 (Type::Date, Value::Date(v)) => self.set_date(row, index, v.clone()),
64 (Type::Date, Value::Undefined) => self.set_undefined(row, index),
65
66 (Type::DateTime, Value::DateTime(v)) => self.set_datetime(row, index, v.clone()),
67 (Type::DateTime, Value::Undefined) => self.set_undefined(row, index),
68
69 (Type::Time, Value::Time(v)) => self.set_time(row, index, v.clone()),
70 (Type::Time, Value::Undefined) => self.set_undefined(row, index),
71
72 (Type::Duration, Value::Duration(v)) => self.set_duration(row, index, v.clone()),
73 (Type::Duration, Value::Undefined) => self.set_undefined(row, index),
74
75 (Type::Uuid4, Value::Uuid4(v)) => self.set_uuid4(row, index, v.clone()),
76 (Type::Uuid4, Value::Undefined) => self.set_undefined(row, index),
77
78 (Type::Uuid7, Value::Uuid7(v)) => self.set_uuid7(row, index, v.clone()),
79 (Type::Uuid7, Value::Undefined) => self.set_undefined(row, index),
80
81 (Type::Blob, Value::Blob(v)) => self.set_blob(row, index, v),
82 (Type::Blob, Value::Undefined) => self.set_undefined(row, index),
83
84 (Type::Int, Value::Int(v)) => self.set_int(row, index, v),
85 (Type::Uint, Value::Uint(v)) => self.set_uint(row, index, v),
86 (Type::Int, Value::Undefined) => self.set_undefined(row, index),
87 (Type::Uint, Value::Undefined) => self.set_undefined(row, index),
88
89 (
90 Type::Decimal {
91 ..
92 },
93 Value::Decimal(v),
94 ) => self.set_decimal(row, index, v),
95 (
96 Type::Decimal {
97 ..
98 },
99 Value::Undefined,
100 ) => self.set_undefined(row, index),
101
102 (Type::Undefined, Value::Undefined) => {}
103 (Type::Any, Value::Any(_)) => unreachable!("Any type cannot be stored in database"),
104 (Type::Any, Value::Undefined) => self.set_undefined(row, index),
105 (ty, val) => unreachable!("{ty:?}, {val:?}"),
106 }
107 }
108
109 pub fn get_value(&self, row: &EncodedValues, index: usize) -> Value {
110 let field = &self.fields[index];
111 if !row.is_defined(index) {
112 return Value::Undefined;
113 }
114 match field.r#type {
115 Type::Boolean => Value::Boolean(self.get_bool(row, index)),
116 Type::Float4 => OrderedF32::try_from(self.get_f32(row, index))
117 .map(Value::Float4)
118 .unwrap_or(Value::Undefined),
119 Type::Float8 => OrderedF64::try_from(self.get_f64(row, index))
120 .map(Value::Float8)
121 .unwrap_or(Value::Undefined),
122 Type::Int1 => Value::Int1(self.get_i8(row, index)),
123 Type::Int2 => Value::Int2(self.get_i16(row, index)),
124 Type::Int4 => Value::Int4(self.get_i32(row, index)),
125 Type::Int8 => Value::Int8(self.get_i64(row, index)),
126 Type::Int16 => Value::Int16(self.get_i128(row, index)),
127 Type::Utf8 => Value::Utf8(self.get_utf8(row, index).to_string()),
128 Type::Uint1 => Value::Uint1(self.get_u8(row, index)),
129 Type::Uint2 => Value::Uint2(self.get_u16(row, index)),
130 Type::Uint4 => Value::Uint4(self.get_u32(row, index)),
131 Type::Uint8 => Value::Uint8(self.get_u64(row, index)),
132 Type::Uint16 => Value::Uint16(self.get_u128(row, index)),
133 Type::Date => Value::Date(self.get_date(row, index)),
134 Type::DateTime => Value::DateTime(self.get_datetime(row, index)),
135 Type::Time => Value::Time(self.get_time(row, index)),
136 Type::Duration => Value::Duration(self.get_duration(row, index)),
137 Type::IdentityId => {
138 Value::IdentityId(IdentityId::from(Uuid7::from(self.get_uuid7(row, index))))
139 }
140 Type::Uuid4 => Value::Uuid4(Uuid4::from(self.get_uuid4(row, index))),
141 Type::Uuid7 => Value::Uuid7(Uuid7::from(self.get_uuid7(row, index))),
142 Type::Blob => Value::Blob(self.get_blob(row, index)),
143 Type::Int => Value::Int(self.get_int(row, index)),
144 Type::Uint => Value::Uint(self.get_uint(row, index)),
145 Type::Decimal {
146 ..
147 } => Value::Decimal(self.get_decimal(row, index)),
148 Type::Undefined => Value::Undefined,
149 Type::Any => unreachable!("Any type cannot be stored in database"),
150 }
151 }
152}
153
154#[cfg(test)]
155#[allow(clippy::approx_constant)]
156mod tests {
157 use reifydb_type::{Blob, Date, DateTime, Duration, OrderedF32, OrderedF64, Time, Type, Uuid4, Uuid7, Value};
158
159 use crate::value::encoded::EncodedValuesLayout;
160
161 #[test]
162 fn test_set_utf8_with_dynamic_content() {
163 let layout = EncodedValuesLayout::new(&[Type::Utf8, Type::Int4, Type::Utf8]);
164 let mut row = layout.allocate();
165
166 let value1 = Value::Utf8("hello".to_string());
167 let value2 = Value::Int4(42);
168 let value3 = Value::Utf8("world".to_string());
169
170 layout.set_value(&mut row, 0, &value1);
171 layout.set_value(&mut row, 1, &value2);
172 layout.set_value(&mut row, 2, &value3);
173
174 assert_eq!(layout.get_utf8(&row, 0), "hello");
175 assert_eq!(layout.get_i32(&row, 1), 42);
176 assert_eq!(layout.get_utf8(&row, 2), "world");
177 }
178
179 #[test]
180 fn test_set_values_with_mixed_dynamic_content() {
181 let layout =
182 EncodedValuesLayout::new(&[Type::Boolean, Type::Utf8, Type::Float4, Type::Utf8, Type::Int2]);
183 let mut row = layout.allocate();
184
185 let values = vec![
186 Value::Boolean(true),
187 Value::Utf8("first_string".to_string()),
188 Value::Float4(OrderedF32::try_from(3.14f32).unwrap()),
189 Value::Utf8("second_string".to_string()),
190 Value::Int2(-100),
191 ];
192
193 layout.set_values(&mut row, &values);
194
195 assert_eq!(layout.get_bool(&row, 0), true);
196 assert_eq!(layout.get_utf8(&row, 1), "first_string");
197 assert_eq!(layout.get_f32(&row, 2), 3.14f32);
198 assert_eq!(layout.get_utf8(&row, 3), "second_string");
199 assert_eq!(layout.get_i16(&row, 4), -100);
200 }
201
202 #[test]
203 fn test_set_with_empty_and_large_utf8() {
204 let layout = EncodedValuesLayout::new(&[Type::Utf8, Type::Utf8, Type::Utf8]);
205 let mut row = layout.allocate();
206
207 let large_string = "X".repeat(2000);
208 let values = vec![
209 Value::Utf8("".to_string()),
210 Value::Utf8(large_string.clone()),
211 Value::Utf8("small".to_string()),
212 ];
213
214 layout.set_values(&mut row, &values);
215
216 assert_eq!(layout.get_utf8(&row, 0), "");
217 assert_eq!(layout.get_utf8(&row, 1), large_string);
218 assert_eq!(layout.get_utf8(&row, 2), "small");
219 assert_eq!(layout.dynamic_section_size(&row), 2005); }
221
222 #[test]
223 fn test_get_from_dynamic_content() {
224 let layout = EncodedValuesLayout::new(&[Type::Utf8, Type::Int8, Type::Utf8]);
225 let mut row = layout.allocate();
226
227 layout.set_utf8(&mut row, 0, "test_string");
228 layout.set_i64(&mut row, 1, 9876543210i64);
229 layout.set_utf8(&mut row, 2, "another_string");
230
231 let value0 = layout.get_value(&row, 0);
232 let value1 = layout.get_value(&row, 1);
233 let value2 = layout.get_value(&row, 2);
234
235 match value0 {
236 Value::Utf8(s) => assert_eq!(s, "test_string"),
237 _ => panic!("Expected UTF8 value"),
238 }
239
240 match value1 {
241 Value::Int8(i) => assert_eq!(i, 9876543210),
242 _ => panic!("Expected Int8 value"),
243 }
244
245 match value2 {
246 Value::Utf8(s) => assert_eq!(s, "another_string"),
247 _ => panic!("Expected UTF8 value"),
248 }
249 }
250
251 #[test]
252 fn test_set_undefined_with_utf8_fields() {
253 let layout = EncodedValuesLayout::new(&[Type::Utf8, Type::Boolean, Type::Utf8]);
254 let mut row = layout.allocate();
255
256 layout.set_value(&mut row, 0, &Value::Utf8("hello".to_string()));
258 layout.set_value(&mut row, 1, &Value::Boolean(true));
259 layout.set_value(&mut row, 2, &Value::Utf8("world".to_string()));
260
261 assert!(row.is_defined(0));
262 assert!(row.is_defined(1));
263 assert!(row.is_defined(2));
264
265 layout.set_value(&mut row, 0, &Value::Undefined);
267 layout.set_value(&mut row, 2, &Value::Undefined);
268
269 assert!(!row.is_defined(0));
270 assert!(row.is_defined(1));
271 assert!(!row.is_defined(2));
272
273 assert_eq!(layout.get_bool(&row, 1), true);
274 }
275
276 #[test]
277 fn test_get_all_types_including_utf8() {
278 let layout = EncodedValuesLayout::new(&[
279 Type::Boolean,
280 Type::Int1,
281 Type::Int2,
282 Type::Int4,
283 Type::Int8,
284 Type::Uint1,
285 Type::Uint2,
286 Type::Uint4,
287 Type::Uint8,
288 Type::Float4,
289 Type::Float8,
290 Type::Utf8,
291 ]);
292 let mut row = layout.allocate();
293
294 layout.set_bool(&mut row, 0, true);
295 layout.set_i8(&mut row, 1, -42);
296 layout.set_i16(&mut row, 2, -1000i16);
297 layout.set_i32(&mut row, 3, -50000i32);
298 layout.set_i64(&mut row, 4, -3000000000i64);
299 layout.set_u8(&mut row, 5, 200u8);
300 layout.set_u16(&mut row, 6, 50000u16);
301 layout.set_u32(&mut row, 7, 3000000000u32);
302 layout.set_u64(&mut row, 8, 15000000000000000000u64);
303 layout.set_f32(&mut row, 9, 2.5);
304 layout.set_f64(&mut row, 10, 123.456789);
305 layout.set_utf8(&mut row, 11, "dynamic_string");
306
307 let values: Vec<Value> = (0..12).map(|i| layout.get_value(&row, i)).collect();
308
309 assert_eq!(values[0], Value::Boolean(true));
310 assert_eq!(values[1], Value::Int1(-42));
311 assert_eq!(values[2], Value::Int2(-1000));
312 assert_eq!(values[3], Value::Int4(-50000));
313 assert_eq!(values[4], Value::Int8(-3000000000));
314 assert_eq!(values[5], Value::Uint1(200));
315 assert_eq!(values[6], Value::Uint2(50000));
316 assert_eq!(values[7], Value::Uint4(3000000000));
317 assert_eq!(values[8], Value::Uint8(15000000000000000000));
318 assert_eq!(values[9], Value::Float4(OrderedF32::try_from(2.5f32).unwrap()));
319 assert_eq!(values[10], Value::Float8(OrderedF64::try_from(123.456789f64).unwrap()));
320 assert_eq!(values[11], Value::Utf8("dynamic_string".to_string()));
321 }
322
323 #[test]
324 fn test_set_values_sparse_with_utf8() {
325 let layout = EncodedValuesLayout::new(&[Type::Utf8, Type::Utf8, Type::Utf8, Type::Utf8]);
326 let mut row = layout.allocate();
327
328 let values = vec![
330 Value::Utf8("first".to_string()),
331 Value::Undefined,
332 Value::Utf8("third".to_string()),
333 Value::Undefined,
334 ];
335
336 layout.set_values(&mut row, &values);
337
338 assert!(row.is_defined(0));
339 assert!(!row.is_defined(1));
340 assert!(row.is_defined(2));
341 assert!(!row.is_defined(3));
342
343 assert_eq!(layout.get_utf8(&row, 0), "first");
344 assert_eq!(layout.get_utf8(&row, 2), "third");
345 }
346
347 #[test]
348 fn test_set_values_unicode_strings() {
349 let layout = EncodedValuesLayout::new(&[Type::Utf8, Type::Int4, Type::Utf8]);
350 let mut row = layout.allocate();
351
352 let values = vec![
353 Value::Utf8("ππβ¨".to_string()),
354 Value::Int4(123),
355 Value::Utf8("Hello δΈη".to_string()),
356 ];
357
358 layout.set_values(&mut row, &values);
359
360 assert_eq!(layout.get_utf8(&row, 0), "ππβ¨");
361 assert_eq!(layout.get_i32(&row, 1), 123);
362 assert_eq!(layout.get_utf8(&row, 2), "Hello δΈη");
363 }
364
365 #[test]
366 fn test_static_fields_only_no_dynamic_with_values() {
367 let layout = EncodedValuesLayout::new(&[Type::Boolean, Type::Int4, Type::Float8]);
368 let mut row = layout.allocate();
369
370 let values = vec![
371 Value::Boolean(false),
372 Value::Int4(999),
373 Value::Float8(OrderedF64::try_from(std::f64::consts::E).unwrap()),
374 ];
375
376 layout.set_values(&mut row, &values);
377
378 assert_eq!(layout.dynamic_section_size(&row), 0);
380 assert_eq!(row.len(), layout.total_static_size());
381
382 assert_eq!(layout.get_bool(&row, 0), false);
383 assert_eq!(layout.get_i32(&row, 1), 999);
384 assert_eq!(layout.get_f64(&row, 2), std::f64::consts::E);
385 }
386
387 #[test]
388 fn test_temporal_types_roundtrip() {
389 let layout = EncodedValuesLayout::new(&[Type::Date, Type::DateTime, Type::Time, Type::Duration]);
390 let mut row = layout.allocate();
391
392 let original_values = vec![
393 Value::Date(Date::new(2025, 7, 15).unwrap()),
394 Value::DateTime(DateTime::now()),
395 Value::Time(Time::new(14, 30, 45, 123456789).unwrap()),
396 Value::Duration(Duration::from_seconds(3600)),
397 ];
398
399 layout.set_values(&mut row, &original_values);
400
401 let retrieved_values: Vec<Value> = (0..4).map(|i| layout.get_value(&row, i)).collect();
402
403 assert_eq!(retrieved_values, original_values);
404 }
405
406 #[test]
407 fn test_temporal_types_with_undefined() {
408 let layout = EncodedValuesLayout::new(&[Type::Date, Type::DateTime, Type::Time, Type::Duration]);
409 let mut row = layout.allocate();
410
411 let values = vec![
412 Value::Date(Date::new(2000, 1, 1).unwrap()),
413 Value::Undefined,
414 Value::Time(Time::default()),
415 Value::Undefined,
416 ];
417
418 layout.set_values(&mut row, &values);
419
420 assert!(row.is_defined(0));
421 assert!(!row.is_defined(1));
422 assert!(row.is_defined(2));
423 assert!(!row.is_defined(3));
424
425 let retrieved_values: Vec<Value> = (0..4).map(|i| layout.get_value(&row, i)).collect();
426
427 assert_eq!(retrieved_values[0], values[0]);
428 assert_eq!(retrieved_values[1], Value::Undefined);
429 assert_eq!(retrieved_values[2], values[2]);
430 assert_eq!(retrieved_values[3], Value::Undefined);
431 }
432
433 #[test]
434 fn test_mixed_temporal_and_regular_types() {
435 let layout = EncodedValuesLayout::new(&[
436 Type::Boolean,
437 Type::Date,
438 Type::Utf8,
439 Type::DateTime,
440 Type::Int4,
441 Type::Time,
442 Type::Duration,
443 ]);
444 let mut row = layout.allocate();
445
446 let values = vec![
447 Value::Boolean(true),
448 Value::Date(Date::new(1985, 10, 26).unwrap()),
449 Value::Utf8("time travel".to_string()),
450 Value::DateTime(DateTime::new(2015, 10, 21, 16, 29, 0, 0).unwrap()),
451 Value::Int4(88),
452 Value::Time(Time::new(12, 0, 0, 0).unwrap()),
453 Value::Duration(Duration::from_minutes(30)),
454 ];
455
456 layout.set_values(&mut row, &values);
457
458 let retrieved_values: Vec<Value> = (0..7).map(|i| layout.get_value(&row, i)).collect();
459
460 assert_eq!(retrieved_values, values);
461 }
462
463 #[test]
464 fn test_roundtrip_with_dynamic_content() {
465 let layout = EncodedValuesLayout::new(&[Type::Utf8, Type::Int2, Type::Utf8, Type::Float4]);
466 let mut row = layout.allocate();
467
468 let original_values = vec![
469 Value::Utf8("roundtrip_test".to_string()),
470 Value::Int2(32000),
471 Value::Utf8("".to_string()),
472 Value::Float4(OrderedF32::try_from(1.5f32).unwrap()),
473 ];
474
475 layout.set_values(&mut row, &original_values);
477
478 let retrieved_values: Vec<Value> = (0..4).map(|i| layout.get_value(&row, i)).collect();
480
481 assert_eq!(retrieved_values, original_values);
482 }
483
484 #[test]
485 fn test_blob_roundtrip() {
486 let layout = EncodedValuesLayout::new(&[Type::Blob, Type::Int4, Type::Blob]);
487 let mut row = layout.allocate();
488
489 let blob1 = Blob::new(vec![0xDE, 0xAD, 0xBE, 0xEF]);
490 let blob2 = Blob::new(vec![]);
491 let values = vec![Value::Blob(blob1.clone()), Value::Int4(42), Value::Blob(blob2.clone())];
492
493 layout.set_values(&mut row, &values);
494
495 let retrieved_values: Vec<Value> = (0..3).map(|i| layout.get_value(&row, i)).collect();
496
497 assert_eq!(retrieved_values, values);
498
499 match &retrieved_values[0] {
501 Value::Blob(b) => assert_eq!(b.as_bytes(), &[0xDE, 0xAD, 0xBE, 0xEF]),
502 _ => panic!("Expected Blob value"),
503 }
504
505 match &retrieved_values[2] {
506 Value::Blob(b) => assert!(b.is_empty()),
507 _ => panic!("Expected Blob value"),
508 }
509 }
510
511 #[test]
512 fn test_blob_with_undefined() {
513 let layout = EncodedValuesLayout::new(&[Type::Blob, Type::Blob, Type::Blob]);
514 let mut row = layout.allocate();
515
516 let values = vec![
517 Value::Blob(Blob::new(vec![0x00, 0x01, 0x02])),
518 Value::Undefined,
519 Value::Blob(Blob::new(vec![0xFF, 0xFE])),
520 ];
521
522 layout.set_values(&mut row, &values);
523
524 assert!(row.is_defined(0));
525 assert!(!row.is_defined(1));
526 assert!(row.is_defined(2));
527
528 let retrieved_values: Vec<Value> = (0..3).map(|i| layout.get_value(&row, i)).collect();
529
530 assert_eq!(retrieved_values[0], values[0]);
531 assert_eq!(retrieved_values[1], Value::Undefined);
532 assert_eq!(retrieved_values[2], values[2]);
533 }
534
535 #[test]
536 fn test_uuid_roundtrip() {
537 let layout = EncodedValuesLayout::new(&[Type::Uuid4, Type::Uuid7, Type::Int4]);
538 let mut row = layout.allocate();
539
540 let uuid4 = Uuid4::generate();
541 let uuid7 = Uuid7::generate();
542 let values = vec![Value::Uuid4(uuid4), Value::Uuid7(uuid7), Value::Int4(123)];
543
544 layout.set_values(&mut row, &values);
545
546 let retrieved_values: Vec<Value> = (0..3).map(|i| layout.get_value(&row, i)).collect();
547
548 assert_eq!(retrieved_values, values);
549 }
550
551 #[test]
552 fn test_uuid_with_undefined() {
553 let layout = EncodedValuesLayout::new(&[Type::Uuid4, Type::Uuid7]);
554 let mut row = layout.allocate();
555
556 let values = vec![Value::Undefined, Value::Uuid7(Uuid7::generate())];
557
558 layout.set_values(&mut row, &values);
559
560 assert!(!row.is_defined(0));
561 assert!(row.is_defined(1));
562
563 let retrieved_values: Vec<Value> = (0..2).map(|i| layout.get_value(&row, i)).collect();
564
565 assert_eq!(retrieved_values[0], Value::Undefined);
566 assert_eq!(retrieved_values[1], values[1]);
567 }
568
569 #[test]
570 fn test_mixed_blob_row_number_uuid_types() {
571 let layout = EncodedValuesLayout::new(&[
572 Type::Blob,
573 Type::Int16,
574 Type::Uuid4,
575 Type::Utf8,
576 Type::Uuid7,
577 Type::Int4,
578 ]);
579 let mut row = layout.allocate();
580
581 let values = vec![
582 Value::Blob(Blob::new(vec![0xCA, 0xFE, 0xBA, 0xBE])),
583 Value::Int16(42424242i128),
584 Value::Uuid4(Uuid4::generate()),
585 Value::Utf8("mixed types test".to_string()),
586 Value::Uuid7(Uuid7::generate()),
587 Value::Int4(-999),
588 ];
589
590 layout.set_values(&mut row, &values);
591
592 let retrieved_values: Vec<Value> = (0..6).map(|i| layout.get_value(&row, i)).collect();
593
594 assert_eq!(retrieved_values, values);
595
596 assert!(layout.dynamic_section_size(&row) > 0);
598 }
599
600 #[test]
601 fn test_all_types_comprehensive() {
602 let layout = EncodedValuesLayout::new(&[
605 Type::Boolean,
606 Type::Int1,
607 Type::Int2,
608 Type::Int4,
609 Type::Int8,
610 Type::Int16,
611 Type::Uint1,
612 Type::Uint2,
613 Type::Uint4,
614 Type::Uint8,
615 Type::Uint16,
616 Type::Float4,
617 Type::Float8,
618 Type::Utf8,
619 Type::Date,
620 Type::DateTime,
621 Type::Time,
622 Type::Duration,
623 Type::Uuid4,
624 Type::Uuid7,
625 Type::Blob,
626 ]);
627 let mut row = layout.allocate();
628
629 let values = vec![
630 Value::Boolean(true),
631 Value::Int1(-128),
632 Value::Int2(-32768),
633 Value::Int4(-2147483648),
634 Value::Int8(-9223372036854775808),
635 Value::Int16(-170141183460469231731687303715884105728),
636 Value::Uint1(255),
637 Value::Uint2(65535),
638 Value::Uint4(4294967295),
639 Value::Uint8(18446744073709551615),
640 Value::Uint16(340282366920938463463374607431768211455),
641 Value::Float4(OrderedF32::try_from(3.14159f32).unwrap()),
642 Value::Float8(OrderedF64::try_from(2.718281828459045).unwrap()),
643 Value::Utf8("comprehensive test".to_string()),
644 Value::Date(Date::new(2025, 12, 31).unwrap()),
645 Value::DateTime(DateTime::new(2025, 1, 1, 0, 0, 0, 0).unwrap()),
646 Value::Time(Time::new(23, 59, 59, 999999999).unwrap()),
647 Value::Duration(Duration::from_hours(24)),
648 Value::Uuid4(Uuid4::generate()),
649 Value::Uuid7(Uuid7::generate()),
650 Value::Blob(Blob::new(vec![
651 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD,
652 0xEE, 0xFF,
653 ])),
654 ];
655
656 layout.set_values(&mut row, &values);
657
658 let retrieved_values: Vec<Value> = (0..21).map(|i| layout.get_value(&row, i)).collect();
659
660 assert_eq!(retrieved_values, values);
661
662 for i in 0..21 {
664 assert!(row.is_defined(i), "Field {} should be defined", i);
665 }
666 }
667}