Skip to main content

reifydb_core/value/column/transform/
append.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use reifydb_type::{
5	Result,
6	storage::DataBitVec,
7	util::bitvec::BitVec,
8	value::{
9		Value,
10		blob::Blob,
11		constraint::Constraint,
12		date::Date,
13		datetime::DateTime,
14		decimal::Decimal,
15		duration::Duration,
16		int::Int,
17		row_number::RowNumber,
18		time::Time,
19		r#type::Type,
20		uint::Uint,
21		uuid::{Uuid4, Uuid7},
22	},
23};
24use uuid::Uuid;
25
26use crate::{
27	encoded::{encoded::EncodedValues, schema::Schema},
28	error::CoreError,
29	value::column::{ColumnData, columns::Columns},
30};
31
32impl Columns {
33	pub fn append_columns(&mut self, other: Columns) -> Result<()> {
34		if self.len() != other.len() {
35			return Err(CoreError::FrameError {
36				message: "mismatched column count".to_string(),
37			}
38			.into());
39		}
40
41		// Append encoded numbers from the other columns
42		if !other.row_numbers.is_empty() {
43			self.row_numbers.make_mut().extend(other.row_numbers.iter().copied());
44		}
45
46		let columns = self.columns.make_mut();
47		for (i, (l, r)) in columns.iter_mut().zip(other.columns.into_iter()).enumerate() {
48			if l.name().text() != r.name().text() {
49				return Err(CoreError::FrameError {
50					message: format!(
51						"column name mismatch at index {}: '{}' vs '{}'",
52						i,
53						l.name().text(),
54						r.name().text(),
55					),
56				}
57				.into());
58			}
59			l.extend(r)?;
60		}
61		Ok(())
62	}
63}
64
65impl Columns {
66	pub fn append_rows(
67		&mut self,
68		schema: &Schema,
69		rows: impl IntoIterator<Item = EncodedValues>,
70		row_numbers: Vec<RowNumber>,
71	) -> Result<()> {
72		if self.len() != schema.field_count() {
73			return Err(CoreError::FrameError {
74				message: format!(
75					"mismatched column count: expected {}, got {}",
76					self.len(),
77					schema.field_count()
78				),
79			}
80			.into());
81		}
82
83		let rows: Vec<EncodedValues> = rows.into_iter().collect();
84
85		// Verify row_numbers length if provided
86		if !row_numbers.is_empty() && row_numbers.len() != rows.len() {
87			return Err(CoreError::FrameError {
88				message: format!(
89					"row_numbers length {} does not match rows length {}",
90					row_numbers.len(),
91					rows.len()
92				),
93			}
94			.into());
95		}
96
97		// Append row numbers if provided
98		if !row_numbers.is_empty() {
99			self.row_numbers.make_mut().extend(row_numbers);
100		}
101
102		// Handle all-none Option column conversion to properly-typed Option column
103		let columns = self.columns.make_mut();
104		for (index, column) in columns.iter_mut().enumerate() {
105			let field = schema.get_field(index).unwrap();
106			let is_all_none = if let ColumnData::Option {
107				bitvec,
108				..
109			} = column.data()
110			{
111				DataBitVec::count_ones(bitvec) == 0
112			} else {
113				false
114			};
115			if is_all_none {
116				let size = column.data().len();
117				let new_data = match field.constraint.get_type() {
118					Type::Boolean => ColumnData::bool_with_bitvec(
119						vec![false; size],
120						BitVec::repeat(size, false),
121					),
122					Type::Float4 => ColumnData::float4_with_bitvec(
123						vec![0.0f32; size],
124						BitVec::repeat(size, false),
125					),
126					Type::Float8 => ColumnData::float8_with_bitvec(
127						vec![0.0f64; size],
128						BitVec::repeat(size, false),
129					),
130					Type::Int1 => ColumnData::int1_with_bitvec(
131						vec![0i8; size],
132						BitVec::repeat(size, false),
133					),
134					Type::Int2 => ColumnData::int2_with_bitvec(
135						vec![0i16; size],
136						BitVec::repeat(size, false),
137					),
138					Type::Int4 => ColumnData::int4_with_bitvec(
139						vec![0i32; size],
140						BitVec::repeat(size, false),
141					),
142					Type::Int8 => ColumnData::int8_with_bitvec(
143						vec![0i64; size],
144						BitVec::repeat(size, false),
145					),
146					Type::Int16 => ColumnData::int16_with_bitvec(
147						vec![0i128; size],
148						BitVec::repeat(size, false),
149					),
150					Type::Utf8 => ColumnData::utf8_with_bitvec(
151						vec![String::new(); size],
152						BitVec::repeat(size, false),
153					),
154					Type::Uint1 => ColumnData::uint1_with_bitvec(
155						vec![0u8; size],
156						BitVec::repeat(size, false),
157					),
158					Type::Uint2 => ColumnData::uint2_with_bitvec(
159						vec![0u16; size],
160						BitVec::repeat(size, false),
161					),
162					Type::Uint4 => ColumnData::uint4_with_bitvec(
163						vec![0u32; size],
164						BitVec::repeat(size, false),
165					),
166					Type::Uint8 => ColumnData::uint8_with_bitvec(
167						vec![0u64; size],
168						BitVec::repeat(size, false),
169					),
170					Type::Uint16 => ColumnData::uint16_with_bitvec(
171						vec![0u128; size],
172						BitVec::repeat(size, false),
173					),
174					Type::Date => ColumnData::date_with_bitvec(
175						vec![Date::default(); size],
176						BitVec::repeat(size, false),
177					),
178					Type::DateTime => ColumnData::datetime_with_bitvec(
179						vec![DateTime::default(); size],
180						BitVec::repeat(size, false),
181					),
182					Type::Time => ColumnData::time_with_bitvec(
183						vec![Time::default(); size],
184						BitVec::repeat(size, false),
185					),
186					Type::Duration => ColumnData::duration_with_bitvec(
187						vec![Duration::default(); size],
188						BitVec::repeat(size, false),
189					),
190					Type::Option(_) => column.data().clone(),
191					Type::IdentityId => ColumnData::identity_id_with_bitvec(
192						vec![Default::default(); size],
193						BitVec::repeat(size, false),
194					),
195					Type::Uuid4 => ColumnData::uuid4_with_bitvec(
196						vec![Uuid4::from(Uuid::nil()); size],
197						BitVec::repeat(size, false),
198					),
199					Type::Uuid7 => ColumnData::uuid7_with_bitvec(
200						vec![Uuid7::from(Uuid::nil()); size],
201						BitVec::repeat(size, false),
202					),
203					Type::Blob => ColumnData::blob_with_bitvec(
204						vec![Blob::new(vec![]); size],
205						BitVec::repeat(size, false),
206					),
207					Type::Int => ColumnData::int_with_bitvec(
208						vec![Int::default(); size],
209						BitVec::repeat(size, false),
210					),
211					Type::Uint => ColumnData::uint_with_bitvec(
212						vec![Uint::default(); size],
213						BitVec::repeat(size, false),
214					),
215					Type::Decimal {
216						..
217					} => ColumnData::decimal_with_bitvec(
218						vec![Decimal::from(0); size],
219						BitVec::repeat(size, false),
220					),
221					Type::DictionaryId => {
222						let mut col_data = ColumnData::dictionary_id_with_bitvec(
223							vec![Default::default(); size],
224							BitVec::repeat(size, false),
225						);
226						if let ColumnData::DictionaryId(container) = &mut col_data {
227							if let Some(Constraint::Dictionary(dict_id, _)) =
228								field.constraint.constraint()
229							{
230								container.set_dictionary_id(*dict_id);
231							}
232						}
233						col_data
234					}
235					Type::Any | Type::List(_) | Type::Record(_) | Type::Tuple(_) => {
236						ColumnData::any_with_bitvec(
237							vec![Box::new(Value::none()); size],
238							BitVec::repeat(size, false),
239						)
240					}
241				};
242
243				*column = column.with_new_data(new_data);
244			}
245
246			// Set dictionary_id on DictionaryId containers from schema constraint
247			if let ColumnData::DictionaryId(container) = column.data_mut() {
248				if container.dictionary_id().is_none() {
249					if let Some(Constraint::Dictionary(dict_id, _)) = field.constraint.constraint()
250					{
251						container.set_dictionary_id(*dict_id);
252					}
253				}
254			}
255		}
256
257		// Append rows using Schema methods
258		for row in &rows {
259			// Check if all fields are defined
260			let all_defined = (0..schema.field_count()).all(|i| row.is_defined(i));
261
262			if all_defined {
263				self.append_all_defined_from_schema(schema, &row)?;
264			} else {
265				self.append_fallback_from_schema(schema, &row)?;
266			}
267		}
268
269		Ok(())
270	}
271
272	fn append_all_defined_from_schema(&mut self, schema: &Schema, row: &EncodedValues) -> Result<()> {
273		let columns = self.columns.make_mut();
274		for (index, column) in columns.iter_mut().enumerate() {
275			let field = schema.get_field(index).unwrap();
276			match (column.data_mut(), field.constraint.get_type()) {
277				// Handle Option-wrapped columns by unwrapping and pushing to inner + bitvec
278				(
279					ColumnData::Option {
280						inner,
281						bitvec,
282					},
283					_ty,
284				) => {
285					let value = schema.get_value(&row, index);
286					if matches!(value, Value::None { .. }) {
287						inner.push_none();
288						DataBitVec::push(bitvec, false);
289					} else {
290						inner.push_value(value);
291						DataBitVec::push(bitvec, true);
292					}
293				}
294				(ColumnData::Bool(container), Type::Boolean) => {
295					container.push(schema.get_bool(&row, index));
296				}
297				(ColumnData::Float4(container), Type::Float4) => {
298					container.push(schema.get_f32(&row, index));
299				}
300				(ColumnData::Float8(container), Type::Float8) => {
301					container.push(schema.get_f64(&row, index));
302				}
303				(ColumnData::Int1(container), Type::Int1) => {
304					container.push(schema.get_i8(&row, index));
305				}
306				(ColumnData::Int2(container), Type::Int2) => {
307					container.push(schema.get_i16(&row, index));
308				}
309				(ColumnData::Int4(container), Type::Int4) => {
310					container.push(schema.get_i32(&row, index));
311				}
312				(ColumnData::Int8(container), Type::Int8) => {
313					container.push(schema.get_i64(&row, index));
314				}
315				(ColumnData::Int16(container), Type::Int16) => {
316					container.push(schema.get_i128(&row, index));
317				}
318				(
319					ColumnData::Utf8 {
320						container,
321						..
322					},
323					Type::Utf8,
324				) => {
325					container.push(schema.get_utf8(&row, index).to_string());
326				}
327				(ColumnData::Uint1(container), Type::Uint1) => {
328					container.push(schema.get_u8(&row, index));
329				}
330				(ColumnData::Uint2(container), Type::Uint2) => {
331					container.push(schema.get_u16(&row, index));
332				}
333				(ColumnData::Uint4(container), Type::Uint4) => {
334					container.push(schema.get_u32(&row, index));
335				}
336				(ColumnData::Uint8(container), Type::Uint8) => {
337					container.push(schema.get_u64(&row, index));
338				}
339				(ColumnData::Uint16(container), Type::Uint16) => {
340					container.push(schema.get_u128(&row, index));
341				}
342				(ColumnData::Date(container), Type::Date) => {
343					container.push(schema.get_date(&row, index));
344				}
345				(ColumnData::DateTime(container), Type::DateTime) => {
346					container.push(schema.get_datetime(&row, index));
347				}
348				(ColumnData::Time(container), Type::Time) => {
349					container.push(schema.get_time(&row, index));
350				}
351				(ColumnData::Duration(container), Type::Duration) => {
352					container.push(schema.get_duration(&row, index));
353				}
354				(ColumnData::Uuid4(container), Type::Uuid4) => {
355					container.push(schema.get_uuid4(&row, index));
356				}
357				(ColumnData::Uuid7(container), Type::Uuid7) => {
358					container.push(schema.get_uuid7(&row, index));
359				}
360				(
361					ColumnData::Blob {
362						container,
363						..
364					},
365					Type::Blob,
366				) => {
367					container.push(schema.get_blob(&row, index));
368				}
369				(
370					ColumnData::Int {
371						container,
372						..
373					},
374					Type::Int,
375				) => {
376					container.push(schema.get_int(&row, index));
377				}
378				(
379					ColumnData::Uint {
380						container,
381						..
382					},
383					Type::Uint,
384				) => {
385					container.push(schema.get_uint(&row, index));
386				}
387				(
388					ColumnData::Decimal {
389						container,
390						..
391					},
392					Type::Decimal {
393						..
394					},
395				) => {
396					container.push(schema.get_decimal(&row, index));
397				}
398				(ColumnData::DictionaryId(container), Type::DictionaryId) => {
399					match schema.get_value(&row, index) {
400						Value::DictionaryId(id) => container.push(id),
401						_ => container.push_default(),
402					}
403				}
404				(_, v) => {
405					return Err(CoreError::FrameError {
406						message: format!(
407							"type mismatch for column '{}'({}): incompatible with value {}",
408							column.name().text(),
409							column.data().get_type(),
410							v
411						),
412					}
413					.into());
414				}
415			}
416		}
417		Ok(())
418	}
419
420	fn append_fallback_from_schema(&mut self, schema: &Schema, row: &EncodedValues) -> Result<()> {
421		let columns = self.columns.make_mut();
422		for (index, column) in columns.iter_mut().enumerate() {
423			let field = schema.get_field(index).unwrap();
424
425			// If the value is undefined, use ColumnData-level push_none
426			// which correctly promotes bare containers to Option-wrapped
427			if !row.is_defined(index) {
428				column.data_mut().push_none();
429				continue;
430			}
431
432			match (column.data_mut(), field.constraint.get_type()) {
433				// Handle Option-wrapped columns
434				(
435					ColumnData::Option {
436						inner,
437						bitvec,
438					},
439					_ty,
440				) => {
441					let value = schema.get_value(row, index);
442					inner.push_value(value);
443					DataBitVec::push(bitvec, true);
444				}
445				(ColumnData::Bool(container), Type::Boolean) => {
446					container.push(schema.get_bool(row, index));
447				}
448				(ColumnData::Float4(container), Type::Float4) => {
449					container.push(schema.get_f32(row, index));
450				}
451				(ColumnData::Float8(container), Type::Float8) => {
452					container.push(schema.get_f64(row, index));
453				}
454				(ColumnData::Int1(container), Type::Int1) => {
455					container.push(schema.get_i8(row, index));
456				}
457				(ColumnData::Int2(container), Type::Int2) => {
458					container.push(schema.get_i16(row, index));
459				}
460				(ColumnData::Int4(container), Type::Int4) => {
461					container.push(schema.get_i32(row, index));
462				}
463				(ColumnData::Int8(container), Type::Int8) => {
464					container.push(schema.get_i64(row, index));
465				}
466				(ColumnData::Int16(container), Type::Int16) => {
467					container.push(schema.get_i128(row, index));
468				}
469				(
470					ColumnData::Utf8 {
471						container,
472						..
473					},
474					Type::Utf8,
475				) => {
476					container.push(schema.get_utf8(row, index).to_string());
477				}
478				(ColumnData::Uint1(container), Type::Uint1) => {
479					container.push(schema.get_u8(row, index));
480				}
481				(ColumnData::Uint2(container), Type::Uint2) => {
482					container.push(schema.get_u16(row, index));
483				}
484				(ColumnData::Uint4(container), Type::Uint4) => {
485					container.push(schema.get_u32(row, index));
486				}
487				(ColumnData::Uint8(container), Type::Uint8) => {
488					container.push(schema.get_u64(row, index));
489				}
490				(ColumnData::Uint16(container), Type::Uint16) => {
491					container.push(schema.get_u128(row, index));
492				}
493				(ColumnData::Date(container), Type::Date) => {
494					container.push(schema.get_date(row, index));
495				}
496				(ColumnData::DateTime(container), Type::DateTime) => {
497					container.push(schema.get_datetime(row, index));
498				}
499				(ColumnData::Time(container), Type::Time) => {
500					container.push(schema.get_time(row, index));
501				}
502				(ColumnData::Duration(container), Type::Duration) => {
503					container.push(schema.get_duration(row, index));
504				}
505				(ColumnData::Uuid4(container), Type::Uuid4) => {
506					container.push(schema.get_uuid4(row, index));
507				}
508				(ColumnData::Uuid7(container), Type::Uuid7) => {
509					container.push(schema.get_uuid7(row, index));
510				}
511				(
512					ColumnData::Int {
513						container,
514						..
515					},
516					Type::Int,
517				) => {
518					container.push(schema.get_int(row, index));
519				}
520				(
521					ColumnData::Uint {
522						container,
523						..
524					},
525					Type::Uint,
526				) => {
527					container.push(schema.get_uint(row, index));
528				}
529				(
530					ColumnData::Decimal {
531						container,
532						..
533					},
534					Type::Decimal {
535						..
536					},
537				) => {
538					container.push(schema.get_decimal(row, index));
539				}
540				(ColumnData::DictionaryId(container), Type::DictionaryId) => {
541					match schema.get_value(row, index) {
542						Value::DictionaryId(id) => container.push(id),
543						_ => container.push_default(),
544					}
545				}
546				(l, r) => unreachable!("{:#?} {:#?}", l, r),
547			}
548		}
549		Ok(())
550	}
551}
552
553#[cfg(test)]
554pub mod tests {
555	mod columns {
556		use reifydb_type::value::{
557			r#type::Type,
558			uuid::{Uuid4, Uuid7},
559		};
560		use uuid::{Timestamp, Uuid};
561
562		use crate::value::column::{Column, ColumnData, columns::Columns};
563
564		#[test]
565		fn test_boolean() {
566			let mut test_instance1 = Columns::new(vec![Column::bool_with_bitvec("id", [true], [false])]);
567
568			let test_instance2 = Columns::new(vec![Column::bool_with_bitvec("id", [false], [true])]);
569
570			test_instance1.append_columns(test_instance2).unwrap();
571
572			assert_eq!(
573				test_instance1[0].data(),
574				&ColumnData::bool_with_bitvec([true, false], [false, true])
575			);
576		}
577
578		#[test]
579		fn test_float4() {
580			let mut test_instance1 = Columns::new(vec![Column::float4("id", [1.0f32, 2.0])]);
581
582			let test_instance2 =
583				Columns::new(vec![Column::float4_with_bitvec("id", [3.0f32, 4.0], [true, false])]);
584
585			test_instance1.append_columns(test_instance2).unwrap();
586
587			assert_eq!(
588				test_instance1[0].data(),
589				&ColumnData::float4_with_bitvec([1.0f32, 2.0, 3.0, 4.0], [true, true, true, false])
590			);
591		}
592
593		#[test]
594		fn test_float8() {
595			let mut test_instance1 = Columns::new(vec![Column::float8("id", [1.0f64, 2.0])]);
596
597			let test_instance2 =
598				Columns::new(vec![Column::float8_with_bitvec("id", [3.0f64, 4.0], [true, false])]);
599
600			test_instance1.append_columns(test_instance2).unwrap();
601
602			assert_eq!(
603				test_instance1[0].data(),
604				&ColumnData::float8_with_bitvec([1.0f64, 2.0, 3.0, 4.0], [true, true, true, false])
605			);
606		}
607
608		#[test]
609		fn test_int1() {
610			let mut test_instance1 = Columns::new(vec![Column::int1("id", [1, 2])]);
611
612			let test_instance2 = Columns::new(vec![Column::int1_with_bitvec("id", [3, 4], [true, false])]);
613
614			test_instance1.append_columns(test_instance2).unwrap();
615
616			assert_eq!(
617				test_instance1[0].data(),
618				&ColumnData::int1_with_bitvec([1, 2, 3, 4], [true, true, true, false])
619			);
620		}
621
622		#[test]
623		fn test_int2() {
624			let mut test_instance1 = Columns::new(vec![Column::int2("id", [1, 2])]);
625
626			let test_instance2 = Columns::new(vec![Column::int2_with_bitvec("id", [3, 4], [true, false])]);
627
628			test_instance1.append_columns(test_instance2).unwrap();
629
630			assert_eq!(
631				test_instance1[0].data(),
632				&ColumnData::int2_with_bitvec([1, 2, 3, 4], [true, true, true, false])
633			);
634		}
635
636		#[test]
637		fn test_int4() {
638			let mut test_instance1 = Columns::new(vec![Column::int4("id", [1, 2])]);
639
640			let test_instance2 = Columns::new(vec![Column::int4_with_bitvec("id", [3, 4], [true, false])]);
641
642			test_instance1.append_columns(test_instance2).unwrap();
643
644			assert_eq!(
645				test_instance1[0].data(),
646				&ColumnData::int4_with_bitvec([1, 2, 3, 4], [true, true, true, false])
647			);
648		}
649
650		#[test]
651		fn test_int8() {
652			let mut test_instance1 = Columns::new(vec![Column::int8("id", [1, 2])]);
653
654			let test_instance2 = Columns::new(vec![Column::int8_with_bitvec("id", [3, 4], [true, false])]);
655
656			test_instance1.append_columns(test_instance2).unwrap();
657
658			assert_eq!(
659				test_instance1[0].data(),
660				&ColumnData::int8_with_bitvec([1, 2, 3, 4], [true, true, true, false])
661			);
662		}
663
664		#[test]
665		fn test_int16() {
666			let mut test_instance1 = Columns::new(vec![Column::int16("id", [1, 2])]);
667
668			let test_instance2 = Columns::new(vec![Column::int16_with_bitvec("id", [3, 4], [true, false])]);
669
670			test_instance1.append_columns(test_instance2).unwrap();
671
672			assert_eq!(
673				test_instance1[0].data(),
674				&ColumnData::int16_with_bitvec([1, 2, 3, 4], [true, true, true, false])
675			);
676		}
677
678		#[test]
679		fn test_string() {
680			let mut test_instance1 = Columns::new(vec![Column::utf8_with_bitvec(
681				"id",
682				vec!["a".to_string(), "b".to_string()],
683				[true, true],
684			)]);
685
686			let test_instance2 = Columns::new(vec![Column::utf8_with_bitvec(
687				"id",
688				vec!["c".to_string(), "d".to_string()],
689				[true, false],
690			)]);
691
692			test_instance1.append_columns(test_instance2).unwrap();
693
694			assert_eq!(
695				test_instance1[0].data(),
696				&ColumnData::utf8_with_bitvec(
697					vec!["a".to_string(), "b".to_string(), "c".to_string(), "d".to_string()],
698					vec![true, true, true, false]
699				)
700			);
701		}
702
703		#[test]
704		fn test_uint1() {
705			let mut test_instance1 = Columns::new(vec![Column::uint1("id", [1, 2])]);
706
707			let test_instance2 = Columns::new(vec![Column::uint1_with_bitvec("id", [3, 4], [true, false])]);
708
709			test_instance1.append_columns(test_instance2).unwrap();
710
711			assert_eq!(
712				test_instance1[0].data(),
713				&ColumnData::uint1_with_bitvec([1, 2, 3, 4], [true, true, true, false])
714			);
715		}
716
717		#[test]
718		fn test_uint2() {
719			let mut test_instance1 = Columns::new(vec![Column::uint2("id", [1, 2])]);
720
721			let test_instance2 = Columns::new(vec![Column::uint2_with_bitvec("id", [3, 4], [true, false])]);
722
723			test_instance1.append_columns(test_instance2).unwrap();
724
725			assert_eq!(
726				test_instance1[0].data(),
727				&ColumnData::uint2_with_bitvec([1, 2, 3, 4], [true, true, true, false])
728			);
729		}
730
731		#[test]
732		fn test_uint4() {
733			let mut test_instance1 = Columns::new(vec![Column::uint4("id", [1, 2])]);
734
735			let test_instance2 = Columns::new(vec![Column::uint4_with_bitvec("id", [3, 4], [true, false])]);
736
737			test_instance1.append_columns(test_instance2).unwrap();
738
739			assert_eq!(
740				test_instance1[0].data(),
741				&ColumnData::uint4_with_bitvec([1, 2, 3, 4], [true, true, true, false])
742			);
743		}
744
745		#[test]
746		fn test_uint8() {
747			let mut test_instance1 = Columns::new(vec![Column::uint8("id", [1, 2])]);
748
749			let test_instance2 = Columns::new(vec![Column::uint8_with_bitvec("id", [3, 4], [true, false])]);
750
751			test_instance1.append_columns(test_instance2).unwrap();
752
753			assert_eq!(
754				test_instance1[0].data(),
755				&ColumnData::uint8_with_bitvec([1, 2, 3, 4], [true, true, true, false])
756			);
757		}
758
759		#[test]
760		fn test_uint16() {
761			let mut test_instance1 = Columns::new(vec![Column::uint16("id", [1, 2])]);
762
763			let test_instance2 =
764				Columns::new(vec![Column::uint16_with_bitvec("id", [3, 4], [true, false])]);
765
766			test_instance1.append_columns(test_instance2).unwrap();
767
768			assert_eq!(
769				test_instance1[0].data(),
770				&ColumnData::uint16_with_bitvec([1, 2, 3, 4], [true, true, true, false])
771			);
772		}
773
774		#[test]
775		fn test_uuid4() {
776			let uuid1 = Uuid4::from(Uuid::new_v4());
777			let uuid2 = Uuid4::from(Uuid::new_v4());
778			let uuid3 = Uuid4::from(Uuid::new_v4());
779			let uuid4 = Uuid4::from(Uuid::new_v4());
780
781			let mut test_instance1 = Columns::new(vec![Column::uuid4("id", [uuid1, uuid2])]);
782
783			let test_instance2 =
784				Columns::new(vec![Column::uuid4_with_bitvec("id", [uuid3, uuid4], [true, false])]);
785
786			test_instance1.append_columns(test_instance2).unwrap();
787
788			assert_eq!(
789				test_instance1[0].data(),
790				&ColumnData::uuid4_with_bitvec([uuid1, uuid2, uuid3, uuid4], [true, true, true, false])
791			);
792		}
793
794		#[test]
795		fn test_uuid7() {
796			let uuid1 = Uuid7::from(Uuid::new_v7(Timestamp::from_gregorian(1, 1)));
797			let uuid2 = Uuid7::from(Uuid::new_v7(Timestamp::from_gregorian(1, 2)));
798			let uuid3 = Uuid7::from(Uuid::new_v7(Timestamp::from_gregorian(2, 1)));
799			let uuid4 = Uuid7::from(Uuid::new_v7(Timestamp::from_gregorian(2, 2)));
800
801			let mut test_instance1 = Columns::new(vec![Column::uuid7("id", [uuid1, uuid2])]);
802
803			let test_instance2 =
804				Columns::new(vec![Column::uuid7_with_bitvec("id", [uuid3, uuid4], [true, false])]);
805
806			test_instance1.append_columns(test_instance2).unwrap();
807
808			assert_eq!(
809				test_instance1[0].data(),
810				&ColumnData::uuid7_with_bitvec([uuid1, uuid2, uuid3, uuid4], [true, true, true, false])
811			);
812		}
813
814		#[test]
815		fn test_with_undefined_lr_promotes_correctly() {
816			let mut test_instance1 =
817				Columns::new(vec![Column::int2_with_bitvec("id", [1, 2], [true, false])]);
818
819			let test_instance2 = Columns::new(vec![Column::undefined_typed("id", Type::Boolean, 2)]);
820
821			test_instance1.append_columns(test_instance2).unwrap();
822
823			assert_eq!(
824				test_instance1[0].data(),
825				&ColumnData::int2_with_bitvec([1, 2, 0, 0], [true, false, false, false])
826			);
827		}
828
829		#[test]
830		fn test_with_undefined_l_promotes_correctly() {
831			let mut test_instance1 = Columns::new(vec![Column::undefined_typed("score", Type::Boolean, 2)]);
832
833			let test_instance2 =
834				Columns::new(vec![Column::int2_with_bitvec("score", [10, 20], [true, false])]);
835
836			test_instance1.append_columns(test_instance2).unwrap();
837
838			assert_eq!(
839				test_instance1[0].data(),
840				&ColumnData::int2_with_bitvec([0, 0, 10, 20], [false, false, true, false])
841			);
842		}
843
844		#[test]
845		fn test_fails_on_column_count_mismatch() {
846			let mut test_instance1 = Columns::new(vec![Column::int2("id", [1])]);
847
848			let test_instance2 = Columns::new(vec![
849				Column::int2("id", [2]),
850				Column::utf8("name", vec!["Bob".to_string()]),
851			]);
852
853			let result = test_instance1.append_columns(test_instance2);
854			assert!(result.is_err());
855		}
856
857		#[test]
858		fn test_fails_on_column_name_mismatch() {
859			let mut test_instance1 = Columns::new(vec![Column::int2("id", [1])]);
860
861			let test_instance2 = Columns::new(vec![Column::int2("wrong", [2])]);
862
863			let result = test_instance1.append_columns(test_instance2);
864			assert!(result.is_err());
865		}
866
867		#[test]
868		fn test_fails_on_type_mismatch() {
869			let mut test_instance1 = Columns::new(vec![Column::int2("id", [1])]);
870
871			let test_instance2 = Columns::new(vec![Column::utf8("id", vec!["A".to_string()])]);
872
873			let result = test_instance1.append_columns(test_instance2);
874			assert!(result.is_err());
875		}
876	}
877
878	mod row {
879		use reifydb_type::{
880			fragment::Fragment,
881			util::bitvec::BitVec,
882			value::{
883				Value,
884				constraint::TypeConstraint,
885				dictionary::{DictionaryEntryId, DictionaryId},
886				ordered_f32::OrderedF32,
887				ordered_f64::OrderedF64,
888				r#type::Type,
889			},
890		};
891
892		use crate::{
893			encoded::schema::{Schema, SchemaField},
894			value::column::{Column, ColumnData, columns::Columns},
895		};
896
897		#[test]
898		fn test_before_undefined_bool() {
899			let mut test_instance =
900				Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
901
902			let schema = Schema::testing(&[Type::Boolean]);
903			let mut row = schema.allocate();
904			schema.set_values(&mut row, &[Value::Boolean(true)]);
905
906			test_instance.append_rows(&schema, [row], vec![]).unwrap();
907
908			assert_eq!(
909				*test_instance[0].data(),
910				ColumnData::bool_with_bitvec(
911					[false, false, true],
912					BitVec::from_slice(&[false, false, true])
913				)
914			);
915		}
916
917		#[test]
918		fn test_before_undefined_float4() {
919			let mut test_instance =
920				Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
921			let schema = Schema::testing(&[Type::Float4]);
922			let mut row = schema.allocate();
923			schema.set_values(&mut row, &[Value::Float4(OrderedF32::try_from(1.5).unwrap())]);
924			test_instance.append_rows(&schema, [row], vec![]).unwrap();
925
926			assert_eq!(
927				*test_instance[0].data(),
928				ColumnData::float4_with_bitvec(
929					[0.0, 0.0, 1.5],
930					BitVec::from_slice(&[false, false, true])
931				)
932			);
933		}
934
935		#[test]
936		fn test_before_undefined_float8() {
937			let mut test_instance =
938				Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
939			let schema = Schema::testing(&[Type::Float8]);
940			let mut row = schema.allocate();
941			schema.set_values(&mut row, &[Value::Float8(OrderedF64::try_from(2.25).unwrap())]);
942			test_instance.append_rows(&schema, [row], vec![]).unwrap();
943
944			assert_eq!(
945				*test_instance[0].data(),
946				ColumnData::float8_with_bitvec(
947					[0.0, 0.0, 2.25],
948					BitVec::from_slice(&[false, false, true])
949				)
950			);
951		}
952
953		#[test]
954		fn test_before_undefined_int1() {
955			let mut test_instance =
956				Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
957			let schema = Schema::testing(&[Type::Int1]);
958			let mut row = schema.allocate();
959			schema.set_values(&mut row, &[Value::Int1(42)]);
960			test_instance.append_rows(&schema, [row], vec![]).unwrap();
961
962			assert_eq!(
963				*test_instance[0].data(),
964				ColumnData::int1_with_bitvec([0, 0, 42], BitVec::from_slice(&[false, false, true]))
965			);
966		}
967
968		#[test]
969		fn test_before_undefined_int2() {
970			let mut test_instance =
971				Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
972			let schema = Schema::testing(&[Type::Int2]);
973			let mut row = schema.allocate();
974			schema.set_values(&mut row, &[Value::Int2(-1234)]);
975			test_instance.append_rows(&schema, [row], vec![]).unwrap();
976
977			assert_eq!(
978				*test_instance[0].data(),
979				ColumnData::int2_with_bitvec([0, 0, -1234], BitVec::from_slice(&[false, false, true]))
980			);
981		}
982
983		#[test]
984		fn test_before_undefined_int4() {
985			let mut test_instance =
986				Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
987			let schema = Schema::testing(&[Type::Int4]);
988			let mut row = schema.allocate();
989			schema.set_values(&mut row, &[Value::Int4(56789)]);
990			test_instance.append_rows(&schema, [row], vec![]).unwrap();
991
992			assert_eq!(
993				*test_instance[0].data(),
994				ColumnData::int4_with_bitvec([0, 0, 56789], BitVec::from_slice(&[false, false, true]))
995			);
996		}
997
998		#[test]
999		fn test_before_undefined_int8() {
1000			let mut test_instance =
1001				Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
1002			let schema = Schema::testing(&[Type::Int8]);
1003			let mut row = schema.allocate();
1004			schema.set_values(&mut row, &[Value::Int8(-987654321)]);
1005			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1006
1007			assert_eq!(
1008				*test_instance[0].data(),
1009				ColumnData::int8_with_bitvec(
1010					[0, 0, -987654321],
1011					BitVec::from_slice(&[false, false, true])
1012				)
1013			);
1014		}
1015
1016		#[test]
1017		fn test_before_undefined_int16() {
1018			let mut test_instance =
1019				Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
1020			let schema = Schema::testing(&[Type::Int16]);
1021			let mut row = schema.allocate();
1022			schema.set_values(&mut row, &[Value::Int16(123456789012345678901234567890i128)]);
1023			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1024
1025			assert_eq!(
1026				*test_instance[0].data(),
1027				ColumnData::int16_with_bitvec(
1028					[0, 0, 123456789012345678901234567890i128],
1029					BitVec::from_slice(&[false, false, true])
1030				)
1031			);
1032		}
1033
1034		#[test]
1035		fn test_before_undefined_string() {
1036			let mut test_instance =
1037				Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
1038			let schema = Schema::testing(&[Type::Utf8]);
1039			let mut row = schema.allocate();
1040			schema.set_values(&mut row, &[Value::Utf8("reifydb".into())]);
1041			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1042
1043			assert_eq!(
1044				*test_instance[0].data(),
1045				ColumnData::utf8_with_bitvec(
1046					["".to_string(), "".to_string(), "reifydb".to_string()],
1047					BitVec::from_slice(&[false, false, true])
1048				)
1049			);
1050		}
1051
1052		#[test]
1053		fn test_before_undefined_uint1() {
1054			let mut test_instance =
1055				Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
1056			let schema = Schema::testing(&[Type::Uint1]);
1057			let mut row = schema.allocate();
1058			schema.set_values(&mut row, &[Value::Uint1(255)]);
1059			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1060
1061			assert_eq!(
1062				*test_instance[0].data(),
1063				ColumnData::uint1_with_bitvec([0, 0, 255], BitVec::from_slice(&[false, false, true]))
1064			);
1065		}
1066
1067		#[test]
1068		fn test_before_undefined_uint2() {
1069			let mut test_instance =
1070				Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
1071			let schema = Schema::testing(&[Type::Uint2]);
1072			let mut row = schema.allocate();
1073			schema.set_values(&mut row, &[Value::Uint2(65535)]);
1074			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1075
1076			assert_eq!(
1077				*test_instance[0].data(),
1078				ColumnData::uint2_with_bitvec([0, 0, 65535], BitVec::from_slice(&[false, false, true]))
1079			);
1080		}
1081
1082		#[test]
1083		fn test_before_undefined_uint4() {
1084			let mut test_instance =
1085				Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
1086			let schema = Schema::testing(&[Type::Uint4]);
1087			let mut row = schema.allocate();
1088			schema.set_values(&mut row, &[Value::Uint4(4294967295)]);
1089			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1090
1091			assert_eq!(
1092				*test_instance[0].data(),
1093				ColumnData::uint4_with_bitvec(
1094					[0, 0, 4294967295],
1095					BitVec::from_slice(&[false, false, true])
1096				)
1097			);
1098		}
1099
1100		#[test]
1101		fn test_before_undefined_uint8() {
1102			let mut test_instance =
1103				Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
1104			let schema = Schema::testing(&[Type::Uint8]);
1105			let mut row = schema.allocate();
1106			schema.set_values(&mut row, &[Value::Uint8(18446744073709551615)]);
1107			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1108
1109			assert_eq!(
1110				*test_instance[0].data(),
1111				ColumnData::uint8_with_bitvec(
1112					[0, 0, 18446744073709551615],
1113					BitVec::from_slice(&[false, false, true])
1114				)
1115			);
1116		}
1117
1118		#[test]
1119		fn test_before_undefined_uint16() {
1120			let mut test_instance =
1121				Columns::new(vec![Column::undefined_typed("test_col", Type::Boolean, 2)]);
1122			let schema = Schema::testing(&[Type::Uint16]);
1123			let mut row = schema.allocate();
1124			schema.set_values(&mut row, &[Value::Uint16(340282366920938463463374607431768211455u128)]);
1125			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1126
1127			assert_eq!(
1128				*test_instance[0].data(),
1129				ColumnData::uint16_with_bitvec(
1130					[0, 0, 340282366920938463463374607431768211455u128],
1131					BitVec::from_slice(&[false, false, true])
1132				)
1133			);
1134		}
1135
1136		#[test]
1137		fn test_mismatched_columns() {
1138			let mut test_instance = Columns::new(vec![]);
1139
1140			let schema = Schema::testing(&[Type::Int2]);
1141			let mut row = schema.allocate();
1142			schema.set_values(&mut row, &[Value::Int2(2)]);
1143
1144			let err = test_instance.append_rows(&schema, [row], vec![]).err().unwrap();
1145			assert!(err.to_string().contains("mismatched column count: expected 0, got 1"));
1146		}
1147
1148		#[test]
1149		fn test_ok() {
1150			let mut test_instance = test_instance_with_columns();
1151
1152			let schema = Schema::testing(&[Type::Int2, Type::Boolean]);
1153			let mut row_one = schema.allocate();
1154			schema.set_values(&mut row_one, &[Value::Int2(2), Value::Boolean(true)]);
1155			let mut row_two = schema.allocate();
1156			schema.set_values(&mut row_two, &[Value::Int2(3), Value::Boolean(false)]);
1157
1158			test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1159
1160			assert_eq!(*test_instance[0].data(), ColumnData::int2([1, 2, 3]));
1161			assert_eq!(*test_instance[1].data(), ColumnData::bool([true, true, false]));
1162		}
1163
1164		#[test]
1165		fn test_all_defined_bool() {
1166			let mut test_instance = Columns::new(vec![Column::bool("test_col", Vec::<bool>::new())]);
1167
1168			let schema = Schema::testing(&[Type::Boolean]);
1169			let mut row_one = schema.allocate();
1170			schema.set_bool(&mut row_one, 0, true);
1171			let mut row_two = schema.allocate();
1172			schema.set_bool(&mut row_two, 0, false);
1173
1174			test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1175
1176			assert_eq!(*test_instance[0].data(), ColumnData::bool([true, false]));
1177		}
1178
1179		#[test]
1180		fn test_all_defined_float4() {
1181			let mut test_instance = Columns::new(vec![Column::float4("test_col", Vec::<f32>::new())]);
1182
1183			let schema = Schema::testing(&[Type::Float4]);
1184			let mut row_one = schema.allocate();
1185			schema.set_values(&mut row_one, &[Value::Float4(OrderedF32::try_from(1.0).unwrap())]);
1186			let mut row_two = schema.allocate();
1187			schema.set_values(&mut row_two, &[Value::Float4(OrderedF32::try_from(2.0).unwrap())]);
1188
1189			test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1190
1191			assert_eq!(*test_instance[0].data(), ColumnData::float4([1.0, 2.0]));
1192		}
1193
1194		#[test]
1195		fn test_all_defined_float8() {
1196			let mut test_instance = Columns::new(vec![Column::float8("test_col", Vec::<f64>::new())]);
1197
1198			let schema = Schema::testing(&[Type::Float8]);
1199			let mut row_one = schema.allocate();
1200			schema.set_values(&mut row_one, &[Value::Float8(OrderedF64::try_from(1.0).unwrap())]);
1201			let mut row_two = schema.allocate();
1202			schema.set_values(&mut row_two, &[Value::Float8(OrderedF64::try_from(2.0).unwrap())]);
1203
1204			test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1205
1206			assert_eq!(*test_instance[0].data(), ColumnData::float8([1.0, 2.0]));
1207		}
1208
1209		#[test]
1210		fn test_all_defined_int1() {
1211			let mut test_instance = Columns::new(vec![Column::int1("test_col", Vec::<i8>::new())]);
1212
1213			let schema = Schema::testing(&[Type::Int1]);
1214			let mut row_one = schema.allocate();
1215			schema.set_values(&mut row_one, &[Value::Int1(1)]);
1216			let mut row_two = schema.allocate();
1217			schema.set_values(&mut row_two, &[Value::Int1(2)]);
1218
1219			test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1220
1221			assert_eq!(*test_instance[0].data(), ColumnData::int1([1, 2]));
1222		}
1223
1224		#[test]
1225		fn test_all_defined_int2() {
1226			let mut test_instance = Columns::new(vec![Column::int2("test_col", Vec::<i16>::new())]);
1227
1228			let schema = Schema::testing(&[Type::Int2]);
1229			let mut row_one = schema.allocate();
1230			schema.set_values(&mut row_one, &[Value::Int2(100)]);
1231			let mut row_two = schema.allocate();
1232			schema.set_values(&mut row_two, &[Value::Int2(200)]);
1233
1234			test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1235
1236			assert_eq!(*test_instance[0].data(), ColumnData::int2([100, 200]));
1237		}
1238
1239		#[test]
1240		fn test_all_defined_int4() {
1241			let mut test_instance = Columns::new(vec![Column::int4("test_col", Vec::<i32>::new())]);
1242
1243			let schema = Schema::testing(&[Type::Int4]);
1244			let mut row_one = schema.allocate();
1245			schema.set_values(&mut row_one, &[Value::Int4(1000)]);
1246			let mut row_two = schema.allocate();
1247			schema.set_values(&mut row_two, &[Value::Int4(2000)]);
1248
1249			test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1250
1251			assert_eq!(*test_instance[0].data(), ColumnData::int4([1000, 2000]));
1252		}
1253
1254		#[test]
1255		fn test_all_defined_int8() {
1256			let mut test_instance = Columns::new(vec![Column::int8("test_col", Vec::<i64>::new())]);
1257
1258			let schema = Schema::testing(&[Type::Int8]);
1259			let mut row_one = schema.allocate();
1260			schema.set_values(&mut row_one, &[Value::Int8(10000)]);
1261			let mut row_two = schema.allocate();
1262			schema.set_values(&mut row_two, &[Value::Int8(20000)]);
1263
1264			test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1265
1266			assert_eq!(*test_instance[0].data(), ColumnData::int8([10000, 20000]));
1267		}
1268
1269		#[test]
1270		fn test_all_defined_int16() {
1271			let mut test_instance = Columns::new(vec![Column::int16("test_col", Vec::<i128>::new())]);
1272
1273			let schema = Schema::testing(&[Type::Int16]);
1274			let mut row_one = schema.allocate();
1275			schema.set_values(&mut row_one, &[Value::Int16(1000)]);
1276			let mut row_two = schema.allocate();
1277			schema.set_values(&mut row_two, &[Value::Int16(2000)]);
1278
1279			test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1280
1281			assert_eq!(*test_instance[0].data(), ColumnData::int16([1000, 2000]));
1282		}
1283
1284		#[test]
1285		fn test_all_defined_string() {
1286			let mut test_instance = Columns::new(vec![Column::utf8("test_col", Vec::<String>::new())]);
1287
1288			let schema = Schema::testing(&[Type::Utf8]);
1289			let mut row_one = schema.allocate();
1290			schema.set_values(&mut row_one, &[Value::Utf8("a".into())]);
1291			let mut row_two = schema.allocate();
1292			schema.set_values(&mut row_two, &[Value::Utf8("b".into())]);
1293
1294			test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1295
1296			assert_eq!(*test_instance[0].data(), ColumnData::utf8(["a".to_string(), "b".to_string()]));
1297		}
1298
1299		#[test]
1300		fn test_all_defined_uint1() {
1301			let mut test_instance = Columns::new(vec![Column::uint1("test_col", Vec::<u8>::new())]);
1302
1303			let schema = Schema::testing(&[Type::Uint1]);
1304			let mut row_one = schema.allocate();
1305			schema.set_values(&mut row_one, &[Value::Uint1(1)]);
1306			let mut row_two = schema.allocate();
1307			schema.set_values(&mut row_two, &[Value::Uint1(2)]);
1308
1309			test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1310
1311			assert_eq!(*test_instance[0].data(), ColumnData::uint1([1, 2]));
1312		}
1313
1314		#[test]
1315		fn test_all_defined_uint2() {
1316			let mut test_instance = Columns::new(vec![Column::uint2("test_col", Vec::<u16>::new())]);
1317
1318			let schema = Schema::testing(&[Type::Uint2]);
1319			let mut row_one = schema.allocate();
1320			schema.set_values(&mut row_one, &[Value::Uint2(100)]);
1321			let mut row_two = schema.allocate();
1322			schema.set_values(&mut row_two, &[Value::Uint2(200)]);
1323
1324			test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1325
1326			assert_eq!(*test_instance[0].data(), ColumnData::uint2([100, 200]));
1327		}
1328
1329		#[test]
1330		fn test_all_defined_uint4() {
1331			let mut test_instance = Columns::new(vec![Column::uint4("test_col", Vec::<u32>::new())]);
1332
1333			let schema = Schema::testing(&[Type::Uint4]);
1334			let mut row_one = schema.allocate();
1335			schema.set_values(&mut row_one, &[Value::Uint4(1000)]);
1336			let mut row_two = schema.allocate();
1337			schema.set_values(&mut row_two, &[Value::Uint4(2000)]);
1338
1339			test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1340
1341			assert_eq!(*test_instance[0].data(), ColumnData::uint4([1000, 2000]));
1342		}
1343
1344		#[test]
1345		fn test_all_defined_uint8() {
1346			let mut test_instance = Columns::new(vec![Column::uint8("test_col", Vec::<u64>::new())]);
1347
1348			let schema = Schema::testing(&[Type::Uint8]);
1349			let mut row_one = schema.allocate();
1350			schema.set_values(&mut row_one, &[Value::Uint8(10000)]);
1351			let mut row_two = schema.allocate();
1352			schema.set_values(&mut row_two, &[Value::Uint8(20000)]);
1353
1354			test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1355
1356			assert_eq!(*test_instance[0].data(), ColumnData::uint8([10000, 20000]));
1357		}
1358
1359		#[test]
1360		fn test_all_defined_uint16() {
1361			let mut test_instance = Columns::new(vec![Column::uint16("test_col", Vec::<u128>::new())]);
1362
1363			let schema = Schema::testing(&[Type::Uint16]);
1364			let mut row_one = schema.allocate();
1365			schema.set_values(&mut row_one, &[Value::Uint16(1000)]);
1366			let mut row_two = schema.allocate();
1367			schema.set_values(&mut row_two, &[Value::Uint16(2000)]);
1368
1369			test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1370
1371			assert_eq!(*test_instance[0].data(), ColumnData::uint16([1000, 2000]));
1372		}
1373
1374		#[test]
1375		fn test_row_with_undefined() {
1376			let mut test_instance = test_instance_with_columns();
1377
1378			let schema = Schema::testing(&[Type::Int2, Type::Boolean]);
1379			let mut row = schema.allocate();
1380			schema.set_values(&mut row, &[Value::none(), Value::Boolean(false)]);
1381
1382			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1383
1384			assert_eq!(
1385				*test_instance[0].data(),
1386				ColumnData::int2_with_bitvec(vec![1, 0], vec![true, false])
1387			);
1388			assert_eq!(*test_instance[1].data(), ColumnData::bool_with_bitvec([true, false], [true, true]));
1389		}
1390
1391		#[test]
1392		fn test_row_with_type_mismatch_fails() {
1393			let mut test_instance = test_instance_with_columns();
1394
1395			let schema = Schema::testing(&[Type::Boolean, Type::Boolean]);
1396			let mut row = schema.allocate();
1397			schema.set_values(&mut row, &[Value::Boolean(true), Value::Boolean(true)]);
1398
1399			let result = test_instance.append_rows(&schema, [row], vec![]);
1400			assert!(result.is_err());
1401			assert!(result.unwrap_err().to_string().contains("type mismatch"));
1402		}
1403
1404		#[test]
1405		fn test_row_wrong_length_fails() {
1406			let mut test_instance = test_instance_with_columns();
1407
1408			let schema = Schema::testing(&[Type::Int2]);
1409			let mut row = schema.allocate();
1410			schema.set_values(&mut row, &[Value::Int2(2)]);
1411
1412			let result = test_instance.append_rows(&schema, [row], vec![]);
1413			assert!(result.is_err());
1414			assert!(result.unwrap_err().to_string().contains("mismatched column count"));
1415		}
1416
1417		#[test]
1418		fn test_fallback_bool() {
1419			let mut test_instance = Columns::new(vec![
1420				Column::bool("test_col", Vec::<bool>::new()),
1421				Column::bool("none", Vec::<bool>::new()),
1422			]);
1423
1424			let schema = Schema::testing(&[Type::Boolean, Type::Boolean]);
1425			let mut row_one = schema.allocate();
1426			schema.set_bool(&mut row_one, 0, true);
1427			schema.set_none(&mut row_one, 1);
1428
1429			test_instance.append_rows(&schema, [row_one], vec![]).unwrap();
1430
1431			assert_eq!(*test_instance[0].data(), ColumnData::bool_with_bitvec([true], [true]));
1432
1433			assert_eq!(*test_instance[1].data(), ColumnData::bool_with_bitvec([false], [false]));
1434		}
1435
1436		#[test]
1437		fn test_fallback_float4() {
1438			let mut test_instance = Columns::new(vec![
1439				Column::float4("test_col", Vec::<f32>::new()),
1440				Column::float4("none", Vec::<f32>::new()),
1441			]);
1442
1443			let schema = Schema::testing(&[Type::Float4, Type::Float4]);
1444			let mut row = schema.allocate();
1445			schema.set_f32(&mut row, 0, 1.5);
1446			schema.set_none(&mut row, 1);
1447
1448			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1449
1450			assert_eq!(*test_instance[0].data(), ColumnData::float4_with_bitvec([1.5], [true]));
1451			assert_eq!(*test_instance[1].data(), ColumnData::float4_with_bitvec([0.0], [false]));
1452		}
1453
1454		#[test]
1455		fn test_fallback_float8() {
1456			let mut test_instance = Columns::new(vec![
1457				Column::float8("test_col", Vec::<f64>::new()),
1458				Column::float8("none", Vec::<f64>::new()),
1459			]);
1460
1461			let schema = Schema::testing(&[Type::Float8, Type::Float8]);
1462			let mut row = schema.allocate();
1463			schema.set_f64(&mut row, 0, 2.5);
1464			schema.set_none(&mut row, 1);
1465
1466			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1467
1468			assert_eq!(*test_instance[0].data(), ColumnData::float8_with_bitvec([2.5], [true]));
1469			assert_eq!(*test_instance[1].data(), ColumnData::float8_with_bitvec([0.0], [false]));
1470		}
1471
1472		#[test]
1473		fn test_fallback_int1() {
1474			let mut test_instance = Columns::new(vec![
1475				Column::int1("test_col", Vec::<i8>::new()),
1476				Column::int1("none", Vec::<i8>::new()),
1477			]);
1478
1479			let schema = Schema::testing(&[Type::Int1, Type::Int1]);
1480			let mut row = schema.allocate();
1481			schema.set_i8(&mut row, 0, 42);
1482			schema.set_none(&mut row, 1);
1483
1484			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1485
1486			assert_eq!(*test_instance[0].data(), ColumnData::int1_with_bitvec([42], [true]));
1487			assert_eq!(*test_instance[1].data(), ColumnData::int1_with_bitvec([0], [false]));
1488		}
1489
1490		#[test]
1491		fn test_fallback_int2() {
1492			let mut test_instance = Columns::new(vec![
1493				Column::int2("test_col", Vec::<i16>::new()),
1494				Column::int2("none", Vec::<i16>::new()),
1495			]);
1496
1497			let schema = Schema::testing(&[Type::Int2, Type::Int2]);
1498			let mut row = schema.allocate();
1499			schema.set_i16(&mut row, 0, -1234i16);
1500			schema.set_none(&mut row, 1);
1501
1502			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1503
1504			assert_eq!(*test_instance[0].data(), ColumnData::int2_with_bitvec([-1234], [true]));
1505			assert_eq!(*test_instance[1].data(), ColumnData::int2_with_bitvec([0], [false]));
1506		}
1507
1508		#[test]
1509		fn test_fallback_int4() {
1510			let mut test_instance = Columns::new(vec![
1511				Column::int4("test_col", Vec::<i32>::new()),
1512				Column::int4("none", Vec::<i32>::new()),
1513			]);
1514
1515			let schema = Schema::testing(&[Type::Int4, Type::Int4]);
1516			let mut row = schema.allocate();
1517			schema.set_i32(&mut row, 0, 56789);
1518			schema.set_none(&mut row, 1);
1519
1520			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1521
1522			assert_eq!(*test_instance[0].data(), ColumnData::int4_with_bitvec([56789], [true]));
1523			assert_eq!(*test_instance[1].data(), ColumnData::int4_with_bitvec([0], [false]));
1524		}
1525
1526		#[test]
1527		fn test_fallback_int8() {
1528			let mut test_instance = Columns::new(vec![
1529				Column::int8("test_col", Vec::<i64>::new()),
1530				Column::int8("none", Vec::<i64>::new()),
1531			]);
1532
1533			let schema = Schema::testing(&[Type::Int8, Type::Int8]);
1534			let mut row = schema.allocate();
1535			schema.set_i64(&mut row, 0, -987654321);
1536			schema.set_none(&mut row, 1);
1537
1538			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1539
1540			assert_eq!(*test_instance[0].data(), ColumnData::int8_with_bitvec([-987654321], [true]));
1541			assert_eq!(*test_instance[1].data(), ColumnData::int8_with_bitvec([0], [false]));
1542		}
1543
1544		#[test]
1545		fn test_fallback_int16() {
1546			let mut test_instance = Columns::new(vec![
1547				Column::int16("test_col", Vec::<i128>::new()),
1548				Column::int16("none", Vec::<i128>::new()),
1549			]);
1550
1551			let schema = Schema::testing(&[Type::Int16, Type::Int16]);
1552			let mut row = schema.allocate();
1553			schema.set_i128(&mut row, 0, 123456789012345678901234567890i128);
1554			schema.set_none(&mut row, 1);
1555
1556			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1557
1558			assert_eq!(
1559				*test_instance[0].data(),
1560				ColumnData::int16_with_bitvec([123456789012345678901234567890i128], [true])
1561			);
1562			assert_eq!(*test_instance[1].data(), ColumnData::int16_with_bitvec([0], [false]));
1563		}
1564
1565		#[test]
1566		fn test_fallback_string() {
1567			let mut test_instance = Columns::new(vec![
1568				Column::utf8("test_col", Vec::<String>::new()),
1569				Column::utf8("none", Vec::<String>::new()),
1570			]);
1571
1572			let schema = Schema::testing(&[Type::Utf8, Type::Utf8]);
1573			let mut row = schema.allocate();
1574			schema.set_utf8(&mut row, 0, "reifydb");
1575			schema.set_none(&mut row, 1);
1576
1577			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1578
1579			assert_eq!(
1580				*test_instance[0].data(),
1581				ColumnData::utf8_with_bitvec(["reifydb".to_string()], [true])
1582			);
1583			assert_eq!(*test_instance[1].data(), ColumnData::utf8_with_bitvec(["".to_string()], [false]));
1584		}
1585
1586		#[test]
1587		fn test_fallback_uint1() {
1588			let mut test_instance = Columns::new(vec![
1589				Column::uint1("test_col", Vec::<u8>::new()),
1590				Column::uint1("none", Vec::<u8>::new()),
1591			]);
1592
1593			let schema = Schema::testing(&[Type::Uint1, Type::Uint1]);
1594			let mut row = schema.allocate();
1595			schema.set_u8(&mut row, 0, 255);
1596			schema.set_none(&mut row, 1);
1597
1598			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1599
1600			assert_eq!(*test_instance[0].data(), ColumnData::uint1_with_bitvec([255], [true]));
1601			assert_eq!(*test_instance[1].data(), ColumnData::uint1_with_bitvec([0], [false]));
1602		}
1603
1604		#[test]
1605		fn test_fallback_uint2() {
1606			let mut test_instance = Columns::new(vec![
1607				Column::uint2("test_col", Vec::<u16>::new()),
1608				Column::uint2("none", Vec::<u16>::new()),
1609			]);
1610
1611			let schema = Schema::testing(&[Type::Uint2, Type::Uint2]);
1612			let mut row = schema.allocate();
1613			schema.set_u16(&mut row, 0, 65535u16);
1614			schema.set_none(&mut row, 1);
1615
1616			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1617
1618			assert_eq!(*test_instance[0].data(), ColumnData::uint2_with_bitvec([65535], [true]));
1619			assert_eq!(*test_instance[1].data(), ColumnData::uint2_with_bitvec([0], [false]));
1620		}
1621
1622		#[test]
1623		fn test_fallback_uint4() {
1624			let mut test_instance = Columns::new(vec![
1625				Column::uint4("test_col", Vec::<u32>::new()),
1626				Column::uint4("none", Vec::<u32>::new()),
1627			]);
1628
1629			let schema = Schema::testing(&[Type::Uint4, Type::Uint4]);
1630			let mut row = schema.allocate();
1631			schema.set_u32(&mut row, 0, 4294967295u32);
1632			schema.set_none(&mut row, 1);
1633
1634			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1635
1636			assert_eq!(*test_instance[0].data(), ColumnData::uint4_with_bitvec([4294967295], [true]));
1637			assert_eq!(*test_instance[1].data(), ColumnData::uint4_with_bitvec([0], [false]));
1638		}
1639
1640		#[test]
1641		fn test_fallback_uint8() {
1642			let mut test_instance = Columns::new(vec![
1643				Column::uint8("test_col", Vec::<u64>::new()),
1644				Column::uint8("none", Vec::<u64>::new()),
1645			]);
1646
1647			let schema = Schema::testing(&[Type::Uint8, Type::Uint8]);
1648			let mut row = schema.allocate();
1649			schema.set_u64(&mut row, 0, 18446744073709551615u64);
1650			schema.set_none(&mut row, 1);
1651
1652			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1653
1654			assert_eq!(
1655				*test_instance[0].data(),
1656				ColumnData::uint8_with_bitvec([18446744073709551615], [true])
1657			);
1658			assert_eq!(*test_instance[1].data(), ColumnData::uint8_with_bitvec([0], [false]));
1659		}
1660
1661		#[test]
1662		fn test_fallback_uint16() {
1663			let mut test_instance = Columns::new(vec![
1664				Column::uint16("test_col", Vec::<u128>::new()),
1665				Column::uint16("none", Vec::<u128>::new()),
1666			]);
1667
1668			let schema = Schema::testing(&[Type::Uint16, Type::Uint16]);
1669			let mut row = schema.allocate();
1670			schema.set_u128(&mut row, 0, 340282366920938463463374607431768211455u128);
1671			schema.set_none(&mut row, 1);
1672
1673			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1674
1675			assert_eq!(
1676				*test_instance[0].data(),
1677				ColumnData::uint16_with_bitvec([340282366920938463463374607431768211455u128], [true])
1678			);
1679			assert_eq!(*test_instance[1].data(), ColumnData::uint16_with_bitvec([0], [false]));
1680		}
1681
1682		#[test]
1683		fn test_all_defined_dictionary_id() {
1684			let constraint = TypeConstraint::dictionary(DictionaryId::from(1u64), Type::Uint4);
1685			let schema = Schema::new(vec![SchemaField::new("status", constraint)]);
1686
1687			let mut test_instance =
1688				Columns::new(vec![Column::dictionary_id("status", Vec::<DictionaryEntryId>::new())]);
1689
1690			let mut row_one = schema.allocate();
1691			schema.set_values(&mut row_one, &[Value::DictionaryId(DictionaryEntryId::U4(10))]);
1692			let mut row_two = schema.allocate();
1693			schema.set_values(&mut row_two, &[Value::DictionaryId(DictionaryEntryId::U4(20))]);
1694
1695			test_instance.append_rows(&schema, [row_one, row_two], vec![]).unwrap();
1696
1697			assert_eq!(
1698				test_instance[0].data().get_value(0),
1699				Value::DictionaryId(DictionaryEntryId::U4(10))
1700			);
1701			assert_eq!(
1702				test_instance[0].data().get_value(1),
1703				Value::DictionaryId(DictionaryEntryId::U4(20))
1704			);
1705		}
1706
1707		#[test]
1708		fn test_fallback_dictionary_id() {
1709			let dict_constraint = TypeConstraint::dictionary(DictionaryId::from(1u64), Type::Uint4);
1710			let schema = Schema::new(vec![
1711				SchemaField::new("dict_col", dict_constraint),
1712				SchemaField::unconstrained("bool_col", Type::Boolean),
1713			]);
1714
1715			let mut test_instance = Columns::new(vec![
1716				Column::dictionary_id("dict_col", Vec::<DictionaryEntryId>::new()),
1717				Column::bool("bool_col", Vec::<bool>::new()),
1718			]);
1719
1720			let mut row = schema.allocate();
1721			schema.set_values(&mut row, &[Value::none(), Value::Boolean(true)]);
1722
1723			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1724
1725			// Dictionary column should be undefined
1726			assert!(!test_instance[0].data().is_defined(0));
1727			// Bool column should be defined
1728			assert_eq!(test_instance[1].data().get_value(0), Value::Boolean(true));
1729		}
1730
1731		#[test]
1732		fn test_before_undefined_dictionary_id() {
1733			let constraint = TypeConstraint::dictionary(DictionaryId::from(2u64), Type::Uint4);
1734			let schema = Schema::new(vec![SchemaField::new("tag", constraint)]);
1735
1736			let mut test_instance = Columns::new(vec![Column::undefined_typed("tag", Type::Boolean, 2)]);
1737
1738			let mut row = schema.allocate();
1739			schema.set_values(&mut row, &[Value::DictionaryId(DictionaryEntryId::U4(5))]);
1740
1741			test_instance.append_rows(&schema, [row], vec![]).unwrap();
1742
1743			// First two are undefined (promoted from Undefined column), third is defined
1744			assert!(!test_instance[0].data().is_defined(0));
1745			assert!(!test_instance[0].data().is_defined(1));
1746			assert!(test_instance[0].data().is_defined(2));
1747			assert_eq!(test_instance[0].data().get_value(2), Value::DictionaryId(DictionaryEntryId::U4(5)));
1748		}
1749
1750		fn test_instance_with_columns() -> Columns {
1751			Columns::new(vec![
1752				Column {
1753					name: Fragment::internal("int2"),
1754					data: ColumnData::int2(vec![1]),
1755				},
1756				Column {
1757					name: Fragment::internal("bool"),
1758					data: ColumnData::bool(vec![true]),
1759				},
1760			])
1761		}
1762	}
1763}