From 503a0ad4c34b91f9351a0bd44f379d3b2321f8a1 Mon Sep 17 00:00:00 2001 From: Will Ayd Date: Fri, 28 Jul 2023 09:44:24 -0400 Subject: [PATCH] working test / protocol --- c/driver/postgresql/statement.cc | 14 ++++++++------ c/validation/adbc_validation.cc | 6 ++---- c/validation/adbc_validation_util.h | 7 +++++++ 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/c/driver/postgresql/statement.cc b/c/driver/postgresql/statement.cc index 7c37ef1606..dd3fd82c8a 100644 --- a/c/driver/postgresql/statement.cc +++ b/c/driver/postgresql/statement.cc @@ -431,12 +431,14 @@ struct BindStream { break; } case ArrowType::NANOARROW_TYPE_INTERVAL_MONTH_DAY_NANO: { - const uint32_t days = ToNetworkInt32( - array_view->children[col]->buffer_views[1].data.as_int32[row]); - const uint32_t months = ToNetworkInt32( - array_view->children[col]->buffer_views[1].data.as_int32[row] + 1); - const int64_t raw_ns = - array_view->children[col]->buffer_views[1].data.as_int64[row] + 1; + const auto buf = + array_view->children[col]->buffer_views[1].data.as_uint8 + row * 16; + const int32_t raw_months = *(int32_t*)buf; + const int32_t raw_days = *(int32_t*)(buf + 4); + const int64_t raw_ns = *(int64_t*)(buf + 8); + + const uint32_t months = ToNetworkInt32(raw_months); + const uint32_t days = ToNetworkInt32(raw_days); const uint64_t ms = ToNetworkInt64(raw_ns / 1000); std::memcpy(param_values[col], &ms, sizeof(uint64_t)); diff --git a/c/validation/adbc_validation.cc b/c/validation/adbc_validation.cc index 0fc0035950..2b814a65fb 100644 --- a/c/validation/adbc_validation.cc +++ b/c/validation/adbc_validation.cc @@ -1266,10 +1266,8 @@ void StatementTest::TestSqlIngestInterval() { ASSERT_EQ(1, reader.array->n_children); if (round_trip_type == type) { - // XXX: for now we can't compare values; we would need casting - // need to extend CompareArray to support intervals - // ASSERT_NO_FATAL_FAILURE( - // CompareArray(reader.array_view->children[0], values)); + ASSERT_NO_FATAL_FAILURE( + CompareArray(reader.array_view->children[0], values)); } ASSERT_NO_FATAL_FAILURE(reader.Next()); diff --git a/c/validation/adbc_validation_util.h b/c/validation/adbc_validation_util.h index 69f21218c7..5cb5a509cb 100644 --- a/c/validation/adbc_validation_util.h +++ b/c/validation/adbc_validation_util.h @@ -375,6 +375,13 @@ void CompareArray(struct ArrowArrayView* array, struct ArrowStringView view = ArrowArrayViewGetStringUnsafe(array, i); std::string str(view.data, view.size_bytes); ASSERT_EQ(*v, str); + } else if constexpr (std::is_same::value) { + ASSERT_NE(array->buffer_views[1].data.data, nullptr); + const auto buf = array->buffer_views[1].data.as_uint8; + const auto record = buf + i * 16; + ASSERT_EQ(memcmp(record, &(*v)->months, 4), 0); + ASSERT_EQ(memcmp(record + 4, &(*v)->days, 4), 0); + ASSERT_EQ(memcmp(record + 8, &(*v)->ns, 8), 0); } else { static_assert(!sizeof(T), "Not yet implemented"); }