From 48ea7f4df255f041db2e3512f473273557f1788c Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Sat, 6 Apr 2024 00:51:07 +0200 Subject: [PATCH] Arrow/Parquet: silently ignore column of type null in GetArrowSchema/GetArrowArray Fixes #9644 --- apps/ogr2ogr_lib.cpp | 4 +- autotest/generate_parquet_test_file.py | 3 ++ autotest/ogr/data/arrow/test.feather | Bin 40066 -> 40170 bytes autotest/ogr/data/parquet/test.parquet | Bin 72623 -> 72995 bytes .../data/parquet/test_single_group.parquet | Bin 47845 -> 48069 bytes .../arrow_common/ograrrowlayer.hpp | 46 +++++++++++++++--- 6 files changed, 44 insertions(+), 9 deletions(-) diff --git a/apps/ogr2ogr_lib.cpp b/apps/ogr2ogr_lib.cpp index 14e863771fc0..084e9ef3486d 100644 --- a/apps/ogr2ogr_lib.cpp +++ b/apps/ogr2ogr_lib.cpp @@ -3883,7 +3883,9 @@ bool SetupTargetLayer::CanUseWriteArrowBatch( !psOptions->bMakeValid) { struct ArrowArrayStream streamSrc; - if (poSrcLayer->GetArrowStream(&streamSrc, nullptr)) + const char *const apszOptions[] = {"SILENCE_GET_SCHEMA_ERROR=YES", + nullptr}; + if (poSrcLayer->GetArrowStream(&streamSrc, apszOptions)) { struct ArrowSchema schemaSrc; if (streamSrc.get_schema(&streamSrc, &schemaSrc) == 0) diff --git a/autotest/generate_parquet_test_file.py b/autotest/generate_parquet_test_file.py index b0c89261ad65..06ae46e218e3 100644 --- a/autotest/generate_parquet_test_file.py +++ b/autotest/generate_parquet_test_file.py @@ -521,8 +521,11 @@ def generate_test_parquet(): type=pa.binary(), ) + null = pa.array([None] * 5, type=pa.null()) + names = [ "boolean", + "null", "uint8", "int8", "uint16", diff --git a/autotest/ogr/data/arrow/test.feather b/autotest/ogr/data/arrow/test.feather index ad4fe9612ec73d4afa0fb7428fd82d4d5aca9c04..219512352f71739956bc5238cd69c96bde37983e 100644 GIT binary patch delta 3482 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[i]->release(out_schema->children[i]); out_schema->children[i] = nullptr; } + else if (IsSilentlyIgnoredFormatForGetArrowSchemaArray( + out_schema->children[i]->format)) + { + // Silently ignore columns with null data type... + out_schema->children[i]->release(out_schema->children[i]); + } else { - // shouldn't happen - CPLError(CE_Failure, CPLE_AppDefined, - "fieldDesc[%d].nIdx < 0 not expected", i); + // can happen with data types we don't support + if (m_aosArrowArrayStreamOptions.FetchBool( + "SILENCE_GET_SCHEMA_ERROR", false)) + { + CPLDebug(GetDriverUCName().c_str(), + "GetArrowSchema() error: fieldDesc[%d].nIdx < 0 " + "not expected: name=%s, format=%s", + i, out_schema->children[i]->name, + out_schema->children[i]->format); + } + else + { + CPLError(CE_Failure, CPLE_NotSupported, + "GetArrowSchema() error: fieldDesc[%d].nIdx < 0 " + "not expected: name=%s, format=%s", + i, out_schema->children[i]->name, + out_schema->children[i]->format); + } for (; i < out_schema->n_children; ++i, ++j) out_schema->children[j] = out_schema->children[i]; out_schema->n_children = j; @@ -4503,14 +4530,17 @@ inline int OGRArrowLayer::GetNextArrowArray(struct ArrowArrayStream *stream, return EIO; } - // Remove bounding box columns from exported array - const auto RemoveBBoxColumns = + // Remove bounding box columns from exported array, or columns + // of unsupported data types that we voluntarily strip off. + const auto RemoveBBoxOrUnsupportedColumns = [out_array, &schema](const std::set &oSetBBoxArrayIndex) { int j = 0; for (int i = 0; i < static_cast(schema.n_children); ++i) { - if (oSetBBoxArrayIndex.find(i) != oSetBBoxArrayIndex.end()) + if (oSetBBoxArrayIndex.find(i) != oSetBBoxArrayIndex.end() || + IsSilentlyIgnoredFormatForGetArrowSchemaArray( + schema.children[i]->format)) { out_array->children[i]->release(out_array->children[i]); out_array->children[i] = nullptr; @@ -4537,11 +4567,11 @@ inline int OGRArrowLayer::GetNextArrowArray(struct ArrowArrayStream *stream, if (iter.second.iArrayIdx >= 0) oSetBBoxArrayIndex.insert(iter.second.iArrayIdx); } - RemoveBBoxColumns(oSetBBoxArrayIndex); + RemoveBBoxOrUnsupportedColumns(oSetBBoxArrayIndex); } else { - RemoveBBoxColumns(m_oSetBBoxArrowColumns); + RemoveBBoxOrUnsupportedColumns(m_oSetBBoxArrowColumns); } if (EQUAL(m_aosArrowArrayStreamOptions.FetchNameValueDef(