Skip to content

Commit

Permalink
ensure fixed-size binary worksd
Browse files Browse the repository at this point in the history
  • Loading branch information
paleolimbot committed Sep 27, 2024
1 parent 20bf27b commit d57a817
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 3 deletions.
9 changes: 6 additions & 3 deletions r/src/as_array.c
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,7 @@ static void as_array_list(SEXP x_sexp, struct ArrowArray* array, SEXP schema_xpt
switch (schema_view->type) {
case NANOARROW_TYPE_BINARY:
case NANOARROW_TYPE_LARGE_BINARY:
case NANOARROW_TYPE_FIXED_SIZE_BINARY:
case NANOARROW_TYPE_BINARY_VIEW:
break;
default:
Expand All @@ -415,9 +416,11 @@ static void as_array_list(SEXP x_sexp, struct ArrowArray* array, SEXP schema_xpt

int64_t len = Rf_xlength(x_sexp);

int result = ArrowArrayInitFromType(array, schema_view->type);
// Use schema here to ensure we fixed-size binary byte width works
struct ArrowSchema* schema = nanoarrow_schema_from_xptr(schema_xptr);
int result = ArrowArrayInitFromSchema(array, schema, error);
if (result != NANOARROW_OK) {
Rf_error("ArrowArrayInitFromType() failed");
Rf_error("ArrowArrayInitFromType() failed: %s", error->message);
}

result = ArrowArrayStartAppending(array);
Expand All @@ -439,7 +442,7 @@ static void as_array_list(SEXP x_sexp, struct ArrowArray* array, SEXP schema_xpt
item_view.size_bytes = Rf_xlength(item);
result = ArrowArrayAppendBytes(array, item_view);
if (result != NANOARROW_OK) {
Rf_error("ArrowArrayAppendString() failed");
Rf_error("ArrowArrayAppendBytes() failed");
}
} else {
Rf_error("All list items must be raw() or NULL in conversion to %s",
Expand Down
29 changes: 29 additions & 0 deletions r/tests/testthat/test-as-array.R
Original file line number Diff line number Diff line change
Expand Up @@ -526,6 +526,35 @@ test_that("as_nanoarrow_array() works for blob::blob() -> na_binary()", {
)
})

test_that("as_nanoarrow_array() works for blob::blob() -> na_fixed_size_binary()", {
# Without nulls
array <- as_nanoarrow_array(blob::as_blob(letters), schema = na_fixed_size_binary(1))
expect_identical(infer_nanoarrow_schema(array)$format, "w:1")
expect_identical(as.raw(array$buffers[[1]]), raw())
expect_identical(array$offset, 0L)
expect_identical(array$null_count, 0L)
expect_identical(
as.raw(array$buffers[[2]]),
as.raw(as_nanoarrow_buffer(paste(letters, collapse = "")))
)

# With nulls
array <- as_nanoarrow_array(
blob::as_blob(c(letters, NA)),
schema = na_fixed_size_binary(1)
)
expect_identical(infer_nanoarrow_schema(array)$format, "w:1")
expect_identical(array$null_count, 1L)
expect_identical(
as.raw(array$buffers[[1]]),
packBits(c(rep(TRUE, 26), FALSE, rep(FALSE, 5)))
)
expect_identical(
as.raw(array$buffers[[2]]),
c(as.raw(as_nanoarrow_buffer(paste(letters, collapse = ""))), as.raw(0x00))
)
})

test_that("as_nanoarrow_array() works for blob::blob() -> na_large_binary()", {
# Without nulls
array <- as_nanoarrow_array(blob::as_blob(letters), schema = na_large_binary())
Expand Down

0 comments on commit d57a817

Please sign in to comment.