@@ -183,6 +183,7 @@ TEST(BinaryArrayTest, TestSetAndGet) {
183183 }
184184 // timestamp
185185 {
186+ // not compact (precision > 3)
186187 std::vector<Timestamp> arr = {Timestamp (0 , 0 ), Timestamp (12345 , 1 )};
187188 BinaryArray array;
188189 BinaryArrayWriter writer = BinaryArrayWriter (&array, arr.size (), 8 , pool.get ());
@@ -193,6 +194,18 @@ TEST(BinaryArrayTest, TestSetAndGet) {
193194 ASSERT_EQ (arr[0 ], array.GetTimestamp (0 , 9 ));
194195 ASSERT_EQ (arr[1 ], array.GetTimestamp (1 , 9 ));
195196 }
197+ {
198+ // compact (precision <= 3)
199+ std::vector<Timestamp> arr = {Timestamp (0 , 0 ), Timestamp (12345 , 0 )};
200+ BinaryArray array;
201+ BinaryArrayWriter writer = BinaryArrayWriter (&array, arr.size (), 8 , pool.get ());
202+ for (size_t i = 0 ; i < arr.size (); i++) {
203+ writer.WriteTimestamp (i, arr[i], 3 );
204+ }
205+ writer.Complete ();
206+ ASSERT_EQ (arr[0 ], array.GetTimestamp (0 , 3 ));
207+ ASSERT_EQ (arr[1 ], array.GetTimestamp (1 , 3 ));
208+ }
196209 // binary
197210 {
198211 std::vector<Bytes> arr;
@@ -379,4 +392,124 @@ TEST(BinaryArrayTest, TestReset) {
379392 ASSERT_EQ (arr, array.ToLongArray ().value ());
380393}
381394
395+ TEST (BinaryArrayTest, TestGetElementSize) {
396+ ASSERT_EQ (sizeof (bool ), BinaryArrayWriter::GetElementSize (arrow::Type::type::BOOL));
397+ ASSERT_EQ (sizeof (int8_t ), BinaryArrayWriter::GetElementSize (arrow::Type::type::INT8));
398+ ASSERT_EQ (sizeof (int16_t ), BinaryArrayWriter::GetElementSize (arrow::Type::type::INT16));
399+ ASSERT_EQ (sizeof (int32_t ), BinaryArrayWriter::GetElementSize (arrow::Type::type::INT32));
400+ ASSERT_EQ (sizeof (int32_t ), BinaryArrayWriter::GetElementSize (arrow::Type::type::DATE32));
401+ ASSERT_EQ (sizeof (int64_t ), BinaryArrayWriter::GetElementSize (arrow::Type::type::INT64));
402+ ASSERT_EQ (sizeof (float ), BinaryArrayWriter::GetElementSize (arrow::Type::type::FLOAT));
403+ ASSERT_EQ (sizeof (double ), BinaryArrayWriter::GetElementSize (arrow::Type::type::DOUBLE));
404+ // default cases: variable-length types use 8 bytes (offset + length)
405+ ASSERT_EQ (8 , BinaryArrayWriter::GetElementSize (arrow::Type::type::STRING));
406+ ASSERT_EQ (8 , BinaryArrayWriter::GetElementSize (arrow::Type::type::BINARY));
407+ ASSERT_EQ (8 , BinaryArrayWriter::GetElementSize (arrow::Type::type::TIMESTAMP));
408+ ASSERT_EQ (8 , BinaryArrayWriter::GetElementSize (arrow::Type::type::DECIMAL128));
409+ }
410+
411+ TEST (BinaryArrayTest, TestSetNullAtWithArrowType) {
412+ auto pool = GetDefaultPool ();
413+
414+ {
415+ // BOOL
416+ BinaryArray array;
417+ BinaryArrayWriter writer (&array, 2 , sizeof (bool ), pool.get ());
418+ writer.WriteBoolean (0 , true );
419+ writer.SetNullAt (1 , arrow::Type::type::BOOL);
420+ writer.Complete ();
421+ ASSERT_FALSE (array.IsNullAt (0 ));
422+ ASSERT_TRUE (array.GetBoolean (0 ));
423+ ASSERT_TRUE (array.IsNullAt (1 ));
424+ }
425+ {
426+ // INT8
427+ BinaryArray array;
428+ BinaryArrayWriter writer (&array, 2 , sizeof (int8_t ), pool.get ());
429+ writer.WriteByte (0 , 42 );
430+ writer.SetNullAt (1 , arrow::Type::type::INT8);
431+ writer.Complete ();
432+ ASSERT_FALSE (array.IsNullAt (0 ));
433+ ASSERT_EQ (42 , array.GetByte (0 ));
434+ ASSERT_TRUE (array.IsNullAt (1 ));
435+ }
436+ {
437+ // INT16
438+ BinaryArray array;
439+ BinaryArrayWriter writer (&array, 2 , sizeof (int16_t ), pool.get ());
440+ writer.WriteShort (0 , 1000 );
441+ writer.SetNullAt (1 , arrow::Type::type::INT16);
442+ writer.Complete ();
443+ ASSERT_FALSE (array.IsNullAt (0 ));
444+ ASSERT_EQ (1000 , array.GetShort (0 ));
445+ ASSERT_TRUE (array.IsNullAt (1 ));
446+ }
447+ {
448+ // INT32
449+ BinaryArray array;
450+ BinaryArrayWriter writer (&array, 2 , sizeof (int32_t ), pool.get ());
451+ writer.WriteInt (0 , 100000 );
452+ writer.SetNullAt (1 , arrow::Type::type::INT32);
453+ writer.Complete ();
454+ ASSERT_FALSE (array.IsNullAt (0 ));
455+ ASSERT_EQ (100000 , array.GetInt (0 ));
456+ ASSERT_TRUE (array.IsNullAt (1 ));
457+ }
458+ {
459+ // DATE32
460+ BinaryArray array;
461+ BinaryArrayWriter writer (&array, 2 , sizeof (int32_t ), pool.get ());
462+ writer.WriteInt (0 , 19000 );
463+ writer.SetNullAt (1 , arrow::Type::type::DATE32);
464+ writer.Complete ();
465+ ASSERT_FALSE (array.IsNullAt (0 ));
466+ ASSERT_EQ (19000 , array.GetDate (0 ));
467+ ASSERT_TRUE (array.IsNullAt (1 ));
468+ }
469+ {
470+ // INT64
471+ BinaryArray array;
472+ BinaryArrayWriter writer (&array, 2 , sizeof (int64_t ), pool.get ());
473+ writer.WriteLong (0 , 123456789L );
474+ writer.SetNullAt (1 , arrow::Type::type::INT64);
475+ writer.Complete ();
476+ ASSERT_FALSE (array.IsNullAt (0 ));
477+ ASSERT_EQ (123456789L , array.GetLong (0 ));
478+ ASSERT_TRUE (array.IsNullAt (1 ));
479+ }
480+ {
481+ // FLOAT
482+ BinaryArray array;
483+ BinaryArrayWriter writer (&array, 2 , sizeof (float ), pool.get ());
484+ writer.WriteFloat (0 , 3 .14f );
485+ writer.SetNullAt (1 , arrow::Type::type::FLOAT);
486+ writer.Complete ();
487+ ASSERT_FALSE (array.IsNullAt (0 ));
488+ ASSERT_FLOAT_EQ (3 .14f , array.GetFloat (0 ));
489+ ASSERT_TRUE (array.IsNullAt (1 ));
490+ }
491+ {
492+ // DOUBLE
493+ BinaryArray array;
494+ BinaryArrayWriter writer (&array, 2 , sizeof (double ), pool.get ());
495+ writer.WriteDouble (0 , 2.718 );
496+ writer.SetNullAt (1 , arrow::Type::type::DOUBLE);
497+ writer.Complete ();
498+ ASSERT_FALSE (array.IsNullAt (0 ));
499+ ASSERT_DOUBLE_EQ (2.718 , array.GetDouble (0 ));
500+ ASSERT_TRUE (array.IsNullAt (1 ));
501+ }
502+ {
503+ // STRING (default path, uses 8-byte null)
504+ BinaryArray array;
505+ BinaryArrayWriter writer (&array, 2 , 8 , pool.get ());
506+ writer.WriteString (0 , BinaryString::FromString (" hello" , pool.get ()));
507+ writer.SetNullAt (1 , arrow::Type::type::STRING);
508+ writer.Complete ();
509+ ASSERT_FALSE (array.IsNullAt (0 ));
510+ ASSERT_EQ (" hello" , std::string (array.GetStringView (0 )));
511+ ASSERT_TRUE (array.IsNullAt (1 ));
512+ }
513+ }
514+
382515} // namespace paimon::test
0 commit comments