You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by pa...@apache.org on 2024/01/27 18:24:18 UTC

(arrow-nanoarrow) branch main updated: fix: Issue with appending NULLs to IntervalArray (#376)

This is an automated email from the ASF dual-hosted git repository.

paleolimbot pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-nanoarrow.git


The following commit(s) were added to refs/heads/main by this push:
     new dab87aae fix: Issue with appending NULLs to IntervalArray (#376)
dab87aae is described below

commit dab87aaea4c2c05d24b745d58e50726bd0553452
Author: William Ayd <wi...@icloud.com>
AuthorDate: Sat Jan 27 13:24:13 2024 -0500

    fix: Issue with appending NULLs to IntervalArray (#376)
    
    closes #375
    
    credit to @jorisvandenbossche for root-causing the issue here
---
 src/nanoarrow/array_inline.h |  4 ++++
 src/nanoarrow/array_test.cc  | 23 ++++++++++++++++++-----
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/src/nanoarrow/array_inline.h b/src/nanoarrow/array_inline.h
index fa62f324..16e4c52e 100644
--- a/src/nanoarrow/array_inline.h
+++ b/src/nanoarrow/array_inline.h
@@ -570,6 +570,10 @@ static inline ArrowErrorCode ArrowArrayAppendInterval(struct ArrowArray* array,
       return EINVAL;
   }
 
+  if (private_data->bitmap.buffer.data != NULL) {
+    NANOARROW_RETURN_NOT_OK(ArrowBitmapAppend(ArrowArrayValidityBitmap(array), 1, 1));
+  }
+
   array->length++;
   return NANOARROW_OK;
 }
diff --git a/src/nanoarrow/array_test.cc b/src/nanoarrow/array_test.cc
index 739e1d8f..8bdcdce4 100644
--- a/src/nanoarrow/array_test.cc
+++ b/src/nanoarrow/array_test.cc
@@ -968,16 +968,26 @@ TEST(ArrayTest, ArrayTestAppendToIntervalArrayMonthDayNano) {
   EXPECT_EQ(ArrowArrayAppendInterval(&array, &interval), NANOARROW_OK);
   EXPECT_EQ(ArrowArrayAppendNull(&array, 1), NANOARROW_OK);
 
+  struct ArrowInterval second;
+  ArrowIntervalInit(&second, ArrowType::NANOARROW_TYPE_INTERVAL_MONTH_DAY_NANO);
+  second.months = 1;
+  second.days = 1;
+  second.ns = 1;
+  EXPECT_EQ(ArrowArrayAppendInterval(&array, &second), NANOARROW_OK);
+  EXPECT_EQ(ArrowArrayAppendNull(&array, 1), NANOARROW_OK);
+
   EXPECT_EQ(ArrowArrayFinishBuildingDefault(&array, nullptr), NANOARROW_OK);
-  EXPECT_EQ(array.length, 2);
-  EXPECT_EQ(array.null_count, 1);
+  EXPECT_EQ(array.length, 4);
+  EXPECT_EQ(array.null_count, 2);
 
   auto data_buffer = reinterpret_cast<const uint8_t*>(array.buffers[1]);
 
-  EXPECT_EQ(memcmp(data_buffer, &interval.months, 4), 0);
-  EXPECT_EQ(memcmp(data_buffer + sizeof(interval.months), &interval.days, 4), 0);
+  EXPECT_EQ(memcmp(data_buffer, &interval.months, sizeof(interval.months)), 0);
+  EXPECT_EQ(memcmp(data_buffer + sizeof(interval.months), &interval.days,
+                   sizeof(interval.days)),
+            0);
   EXPECT_EQ(memcmp(data_buffer + sizeof(interval.months) + sizeof(interval.days),
-                   &interval.ns, 8),
+                   &interval.ns, sizeof(interval.ns)),
             0);
 
   auto arrow_array = ImportArray(&array, month_day_nano_interval());
@@ -987,6 +997,9 @@ TEST(ArrayTest, ArrayTestAppendToIntervalArrayMonthDayNano) {
   MonthDayNanoIntervalType::MonthDayNanos mdn = {2, 12, 42};
   ARROW_EXPECT_OK(builder.Append(mdn));
   ARROW_EXPECT_OK(builder.AppendNulls(1));
+  MonthDayNanoIntervalType::MonthDayNanos ones = {1, 1, 1};
+  ARROW_EXPECT_OK(builder.Append(ones));
+  ARROW_EXPECT_OK(builder.AppendNulls(1));
   auto expected_array = builder.Finish();
 
   EXPECT_TRUE(arrow_array.ValueUnsafe()->Equals(expected_array.ValueUnsafe()));