From d045cb65b68f670d077521a5a36078445362fc0d Mon Sep 17 00:00:00 2001 From: Sirui Mu Date: Wed, 5 Nov 2025 23:17:55 +0800 Subject: [PATCH] GH-48062: [C++] Fix null pointer dereference in MakeExecBatch --- cpp/src/arrow/compute/expression.cc | 3 ++- cpp/src/arrow/compute/expression_test.cc | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/cpp/src/arrow/compute/expression.cc b/cpp/src/arrow/compute/expression.cc index 3c2ec100402..2563674a59c 100644 --- a/cpp/src/arrow/compute/expression.cc +++ b/cpp/src/arrow/compute/expression.cc @@ -687,7 +687,8 @@ Result MakeExecBatch(const Schema& full_schema, const Datum& partial, } // wasteful but useful for testing: - if (partial.type()->id() == Type::STRUCT) { + const auto& partial_type = partial.type(); + if (partial_type && partial_type->id() == Type::STRUCT) { if (partial.is_array()) { ARROW_ASSIGN_OR_RAISE(auto partial_batch, RecordBatch::FromStructArray(partial.make_array())); diff --git a/cpp/src/arrow/compute/expression_test.cc b/cpp/src/arrow/compute/expression_test.cc index bbab57feebb..5e1f3c093ee 100644 --- a/cpp/src/arrow/compute/expression_test.cc +++ b/cpp/src/arrow/compute/expression_test.cc @@ -224,6 +224,9 @@ TEST(ExpressionUtils, MakeExecBatch) { auto duplicated_names = RecordBatch::Make(schema({GetField("i32"), GetField("i32")}), kNumRows, {i32, i32}); ASSERT_RAISES(Invalid, MakeExecBatch(*kBoringSchema, duplicated_names)); + + ASSERT_OK_AND_ASSIGN(auto boring_table, Table::MakeEmpty(kBoringSchema)); + ASSERT_RAISES(NotImplemented, MakeExecBatch(*kBoringSchema, boring_table)); } class WidgetifyOptions : public compute::FunctionOptions {