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) {