Skip to main content

reifydb_core/value/column/transform/
append.rs

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