From 9018f3d51aa615350f0c35595c8692393981ab7f Mon Sep 17 00:00:00 2001 From: Aaditya Srinivasan Date: Fri, 26 Jun 2026 11:06:10 +0530 Subject: [PATCH] GH-50231: Handle unset Substrait extension mapping type --- cpp/src/arrow/engine/substrait/serde_test.cc | 29 +++++++++++++++++++ .../arrow/engine/substrait/util_internal.h | 4 ++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/cpp/src/arrow/engine/substrait/serde_test.cc b/cpp/src/arrow/engine/substrait/serde_test.cc index 039920066afa..4de5480ef3cd 100644 --- a/cpp/src/arrow/engine/substrait/serde_test.cc +++ b/cpp/src/arrow/engine/substrait/serde_test.cc @@ -1552,6 +1552,35 @@ TEST(Substrait, InvalidMinimumVersion) { ASSERT_RAISES(Invalid, DeserializePlans(*buf, [] { return kNullConsumer; })); } +TEST(Substrait, InvalidEmptyExtensionDeclaration) { + ASSERT_OK_AND_ASSIGN(auto buf, internal::SubstraitFromJSON("Plan", R"({ + "version": { "major_number": 9999, "minor_number": 9999, "patch_number": 9999 }, + "relations": [{ + "rel": { + "read": { + "base_schema": { + "names": ["A"], + "struct": { + "types": [{ + "i32": {} + }] + } + }, + "named_table": { + "names": ["x"] + } + } + } + }], + "extensionUris": [], + "extensions": [ + {} + ] + })")); + + ASSERT_RAISES(Invalid, DeserializePlans(*buf, [] { return kNullConsumer; })); +} + TEST(Substrait, JoinPlanBasic) { std::string substrait_json = R"({ "version": { "major_number": 9999, "minor_number": 9999, "patch_number": 9999 }, diff --git a/cpp/src/arrow/engine/substrait/util_internal.h b/cpp/src/arrow/engine/substrait/util_internal.h index d812bbf7b85f..2a0e5d55e3c9 100644 --- a/cpp/src/arrow/engine/substrait/util_internal.h +++ b/cpp/src/arrow/engine/substrait/util_internal.h @@ -79,7 +79,9 @@ Result GetExtensionSetFromMessage( } default: - Unreachable(); + return Status::Invalid( + "Invalid Substrait SimpleExtensionDeclaration: mapping_type is unset or " + "unknown"); } }