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 2e0eda11 fix: Include missing cases in `ArrowArrayInitFromType()` 
(#588)
2e0eda11 is described below

commit 2e0eda11f8fae695ce02e6fbd422c93a835bb5f3
Author: Dewey Dunnington <[email protected]>
AuthorDate: Mon Aug 19 15:34:54 2024 -0300

    fix: Include missing cases in `ArrowArrayInitFromType()` (#588)
    
    Closes #587.
---
 src/nanoarrow/common/array.c       | 20 +++++++++++++++++++-
 src/nanoarrow/common/array_test.cc | 11 ++++++++++-
 2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/src/nanoarrow/common/array.c b/src/nanoarrow/common/array.c
index 5a9635e5..6446d4b0 100644
--- a/src/nanoarrow/common/array.c
+++ b/src/nanoarrow/common/array.c
@@ -106,7 +106,6 @@ static ArrowErrorCode ArrowArraySetStorageType(struct 
ArrowArray* array,
     case NANOARROW_TYPE_DENSE_UNION:
       array->n_buffers = 2;
       break;
-
     case NANOARROW_TYPE_STRING:
     case NANOARROW_TYPE_LARGE_STRING:
     case NANOARROW_TYPE_BINARY:
@@ -156,6 +155,25 @@ ArrowErrorCode ArrowArrayInitFromType(struct ArrowArray* 
array,
   array->private_data = private_data;
   array->buffers = (const void**)(&private_data->buffer_data);
 
+  // These are not technically "storage" in the sense that they do not appear
+  // in the ArrowSchemaView's storage_type member; however, allowing them here
+  // is helpful to maximize the number of types that can avoid going through
+  // ArrowArrayInitFromSchema().
+  switch (storage_type) {
+    case NANOARROW_TYPE_DURATION:
+    case NANOARROW_TYPE_TIMESTAMP:
+    case NANOARROW_TYPE_TIME64:
+    case NANOARROW_TYPE_DATE64:
+      storage_type = NANOARROW_TYPE_INT64;
+      break;
+    case NANOARROW_TYPE_TIME32:
+    case NANOARROW_TYPE_DATE32:
+      storage_type = NANOARROW_TYPE_INT32;
+      break;
+    default:
+      break;
+  }
+
   int result = ArrowArraySetStorageType(array, storage_type);
   if (result != NANOARROW_OK) {
     ArrowArrayRelease(array);
diff --git a/src/nanoarrow/common/array_test.cc 
b/src/nanoarrow/common/array_test.cc
index abb49a69..b41ba9d2 100644
--- a/src/nanoarrow/common/array_test.cc
+++ b/src/nanoarrow/common/array_test.cc
@@ -77,7 +77,16 @@ TEST(ArrayTest, ArrayTestInit) {
   EXPECT_EQ(array.n_buffers, 3);
   ArrowArrayRelease(&array);
 
-  EXPECT_EQ(ArrowArrayInitFromType(&array, NANOARROW_TYPE_DATE64), EINVAL);
+  EXPECT_EQ(ArrowArrayInitFromType(&array, NANOARROW_TYPE_DICTIONARY), EINVAL);
+
+  // Check that we can support non-storage types where possible
+  EXPECT_EQ(ArrowArrayInitFromType(&array, NANOARROW_TYPE_DATE32), 
NANOARROW_OK);
+  EXPECT_EQ(array.n_buffers, 2);
+  ArrowArrayRelease(&array);
+
+  EXPECT_EQ(ArrowArrayInitFromType(&array, NANOARROW_TYPE_DATE64), 
NANOARROW_OK);
+  EXPECT_EQ(array.n_buffers, 2);
+  ArrowArrayRelease(&array);
 }
 
 TEST(ArrayTest, ArrayTestAllocateChildren) {

Reply via email to