This is an automated email from the ASF dual-hosted git repository.
lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git
The following commit(s) were added to refs/heads/main by this push:
new 86667c4d7 fix(c/validation): compare widened ingestion values (#4778)
86667c4d7 is described below
commit 86667c4d7fea767b7aeceb5639147cc6c4861f54
Author: Fredrik Fornwall <[email protected]>
AuthorDate: Mon Sep 14 02:37:55 2026 +0200
fix(c/validation): compare widened ingestion values (#4778)
Compare ingestion values and nulls after lossless numeric widening and
string/binary normalization, fixing checks skipped when Arrow types
differ.
The `CompareArray` comparison function seems to handle the comparisons
just fine here.
Signed-off-by: Fredrik Fornwall <[email protected]>
---
c/validation/adbc_validation_statement.cc | 40 +++++++++++++++++++++++++++++--
1 file changed, 38 insertions(+), 2 deletions(-)
diff --git a/c/validation/adbc_validation_statement.cc
b/c/validation/adbc_validation_statement.cc
index 11c802b23..e77ad0588 100644
--- a/c/validation/adbc_validation_statement.cc
+++ b/c/validation/adbc_validation_statement.cc
@@ -85,6 +85,43 @@ void StatementTest::TestRelease() {
ASSERT_EQ(NULL, statement.private_data);
}
+namespace {
+
+bool CanCompareIngestValues(ArrowType input, ArrowType output) {
+ if (input == output) return true;
+
+ switch (input) {
+ case NANOARROW_TYPE_BOOL:
+ return output == NANOARROW_TYPE_INT8 || output == NANOARROW_TYPE_INT16 ||
+ output == NANOARROW_TYPE_INT32 || output == NANOARROW_TYPE_INT64;
+ case NANOARROW_TYPE_INT8:
+ case NANOARROW_TYPE_UINT8:
+ return output == NANOARROW_TYPE_INT16 || output == NANOARROW_TYPE_INT32
||
+ output == NANOARROW_TYPE_INT64;
+ case NANOARROW_TYPE_INT16:
+ case NANOARROW_TYPE_UINT16:
+ return output == NANOARROW_TYPE_INT32 || output == NANOARROW_TYPE_INT64;
+ case NANOARROW_TYPE_INT32:
+ case NANOARROW_TYPE_UINT32:
+ return output == NANOARROW_TYPE_INT64;
+ case NANOARROW_TYPE_HALF_FLOAT:
+ return output == NANOARROW_TYPE_FLOAT || output == NANOARROW_TYPE_DOUBLE;
+ case NANOARROW_TYPE_FLOAT:
+ return output == NANOARROW_TYPE_DOUBLE;
+ case NANOARROW_TYPE_LARGE_STRING:
+ case NANOARROW_TYPE_STRING_VIEW:
+ return output == NANOARROW_TYPE_STRING;
+ case NANOARROW_TYPE_LARGE_BINARY:
+ case NANOARROW_TYPE_BINARY_VIEW:
+ case NANOARROW_TYPE_FIXED_SIZE_BINARY:
+ return output == NANOARROW_TYPE_BINARY;
+ default:
+ return false;
+ }
+}
+
+} // namespace
+
template <typename CType>
void StatementTest::TestSqlIngestType(SchemaField field,
const std::vector<std::optional<CType>>&
values,
@@ -175,8 +212,7 @@ void StatementTest::TestSqlIngestType(SchemaField field,
ASSERT_EQ(values.size(), reader.array->length);
ASSERT_EQ(1, reader.array->n_children);
- if (round_trip_field.type == field.type) {
- // XXX: for now we can't compare values; we would need casting
+ if (CanCompareIngestValues(field.type, round_trip_field.type)) {
ASSERT_NO_FATAL_FAILURE(
CompareArray<CType>(reader.array_view->children[0], values));
}