physical-plan: decoding an Unnest or Explain node with an unset field panics

Đang mở Phù hợp với người mới
#26,999 1 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

@geoHeil đang làm issue này rồi.

Từ ngày 4/11/2026.

  • #27105 của @geoHeil — đang mở

Đánh giá

Độ khó
2/5
Thời gian dự kiến
1-3 giờ
Mức phù hợp với người mới
75/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
rust
Lĩnh vực
backend

Hướng nghiên cứu

Bắt đầu từ datafusion/physical-plan/src/unnest.rs, trong UnnestExec::try_from_proto, nơi recursion.input_column và recursion.output_column đang được unwrap. Sau đó xem datafusion/physical-plan/src/explain.rs, trong stringified_plan_from_proto và ExplainExec::try_from_proto, nơi plan_type và plan_type_enum đang được unwrap. Hoàn thành khi cả hai đường đi đều trả về internal_err nêu tên trường bị thiếu, và có một test decode cho mỗi trường hợp.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

Describe the bug

Two physical plan decoders in datafusion-physical-plan panic on a field the wire leaves unset. Their neighbours return an error in the same situation.

UnnestExec::try_from_proto unwraps both columns of each recursion option:

https://github.com/apache/datafusion/blob/934691e9af8f11bf4b629f21bb17795abfb84d93/datafusion/physical-plan/src/unnest.rs#L468-L469

input_column: recursion.input_column.as_ref().unwrap().into(),
output_column: recursion.output_column.as_ref().unwrap().into(),

RecursionUnnestOption.input_column and .output_column are optional messages, so a peer can leave either one unset. A few lines earlier, the same function refuses a missing options with internal_datafusion_err!:

https://github.com/apache/datafusion/blob/934691e9af8f11bf4b629f21bb17795abfb84d93/datafusion/physical-plan/src/unnest.rs#L443-L447

ExplainExec::try_from_proto maps each stringified plan through stringified_plan_from_proto. That function panics when plan_type, or its plan_type_enum, is unset:

https://github.com/apache/datafusion/blob/934691e9af8f11bf4b629f21bb17795abfb84d93/datafusion/physical-plan/src/explain.rs#L357-L365

ExplainExec::try_from_proto itself refuses a missing schema with an error:

https://github.com/apache/datafusion/blob/934691e9af8f11bf4b629f21bb17795abfb84d93/datafusion/physical-plan/src/explain.rs#L253-L257

The same code is in 55.1.0, at src/unnest.rs lines 473-474 and src/explain.rs lines 355-363.

To Reproduce

Decode a PhysicalPlanNode with datafusion_proto::bytes::physical_plan_from_bytes, where the node is one of:

  • an Explain node with a schema and one StringifiedPlan::default() in stringified_plans, so plan_type is None;
  • an Unnest node with a decodable input and schema, and options.recursions holding one RecursionUnnestOption::default(), so input_column is None.

Both reach the panic without any earlier check failing. I found these by reading the decode path and have not run these exact inputs here yet. I will add the panic output once a decode test on our side has run.

Expected behavior

Return internal_err! naming the missing field, as the sibling checks do. The caller then gets Err and keeps running.

Additional context

This matters wherever a process decodes plans it did not encode itself, such as a distributed worker that receives plan stages from peers. A malformed node panics the decoding task, and under panic = "abort" it stops the whole process. A related case in datafusion-proto is #26998.

The fix is two ok_or_else calls plus a decode test for each. I can open the PR if that is welcome.

Ngôn ngữ chính
Rust
Star
9.6k
Fork
2.6k
Merge trung bình
3 ngày 21 giờ
Pull request đã merge (30 ngày)
331

Chuẩn bị môi trường

Mở trong Codespaces

Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của apache/datafusion

Tất cả issue của apache/datafusion

Issue tương tự

Thêm issue về Rust

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.