Skip to content

chore(proto): remove never-released deprecated PhysicalPlanNodeExt scaffolding - #24269

Merged
alamb merged 1 commit into
apache:mainfrom
pydantic:claude/physicalplannodeext-deprecation-a0351c
Aug 11, 2026
Merged

chore(proto): remove never-released deprecated PhysicalPlanNodeExt scaffolding#24269
alamb merged 1 commit into
apache:mainfrom
pydantic:claude/physicalplannodeext-deprecation-a0351c

Conversation

@adriangb

Copy link
Copy Markdown
Contributor

Which issue does this PR close?

Rationale for this change

PhysicalPlanNodeExt currently carries 59 #[deprecated(since = "55.0.0")] methods — per-operator try_into_*_physical_plan / try_from_*_exec shims left behind by the ExecutionPlan::try_to_proto / try_from_proto migration. Each is a thin forwarder to the operator's own hook; none is called by DataFusion.

These methods have never shipped in any DataFusion release, so no deprecation window is owed:

  • At the 54.1.0 tag they were private inherent methods on impl protobuf::PhysicalPlanNode — not pub, not on a public trait:

    $ git show 54.1.0:datafusion/proto/src/physical_plan/mod.rs | sed -n '700,701p'
    impl protobuf::PhysicalPlanNode {
        fn try_into_explain_physical_plan(
  • Split proto serialization to encapsulate private state (#21835) #21929 (merge commit 077f08a9a6632324c95275dd15b5dd5b1f14006f, merged 2026-05-22) is what promoted them into the public PhysicalPlanNodeExt trait, and it is not an ancestor of 54.1.0 (54.1.0 was cut off the 54.0.x line):

    $ git merge-base --is-ancestor 077f08a9a6632324c95275dd15b5dd5b1f14006f 54.1.0; echo $?
    1
  • Every one of them is marked #[deprecated(since = "55.0.0")], so 55.0.0 would be the very first release to expose them — already deprecated.

The API health policy exists to protect API that users could have depended on from a release. Nothing released ever exposed these. Deleting them before the 55.0.0 branch is cut avoids shipping 59 dead-on-arrival public methods that we would then be obliged to carry for a full deprecation cycle.

Removing them also deletes ~1350 lines from datafusion/proto/src/physical_plan/mod.rs, which makes the remaining, load-bearing surface of the trait much easier to read.

What changes are included in this PR?

  • Delete the 59 #[deprecated(since = "55.0.0")] methods from PhysicalPlanNodeExt (29 try_from_*_exec encoders, 30 try_into_* decoders).
  • Drop three use statements that became unused as a result: DataSinkExec, BoundedWindowAggExec, SortMergeJoinExecNode.
  • Delete deprecated_projection_shim_decodes_argument_not_self, the one test that existed solely to pin the behaviour of the try_into_projection_physical_plan shim.

Deliberately not changed:

  • The trait itself and its 16 non-deprecated methods stay: node(), try_into_physical_plan_with_converter, try_into_physical_plan_with_context, try_from_physical_plan_with_converter, the scan/extension/generate-series decoders and try_from_data_source_exec / try_from_lazy_memory_exec that the central dispatch still calls.
  • AsExecutionPlan, PhysicalExtensionCodec, PhysicalProtoConverterExtension are untouched.
  • No .proto files and no encode/decode dispatch behaviour are touched — the wire format is unchanged.
  • The TryFromProto<&protobuf::{Json,Csv,Parquet}Sink> impls in from_proto.rs mentioned in [EPIC] Port ExecutionPlan serialization to try_to_proto / try_from_proto hooks #23494 are not removed here: they are not marked #[deprecated] (there are no deprecated attributes anywhere in from_proto.rs / to_proto.rs), so they don't fall under the "never-released deprecated scaffolding" argument above and deserve their own decision.

Are these changes tested?

Covered by the existing test suite; the change is a pure deletion of unreferenced code.

The one deleted test only exercised the deprecated shim. The underlying ProjectionExec::try_to_proto / ProjectionExec::try_from_proto hook keeps full roundtrip coverage through the existing roundtrip_test cases in datafusion/proto/tests/cases/roundtrip_physical_plan.rs (e.g. roundtrip_like, roundtrip_projection_source, roundtrip_empty_projection).

Verified locally:

  • cargo fmt --all
  • ./ci/scripts/rust_clippy.sh (CI's exact workspace + --all-targets clippy, clean)
  • RUST_BACKTRACE=1 cargo test --profile ci -p datafusion-proto --features avro,json — 238 tests pass, 0 failures
  • cargo check -p datafusion-examples --examples (two examples import PhysicalPlanNodeExt; both only use methods that stay)
  • cargo doc -p datafusion-proto --no-deps (no dangling intra-doc links)

Are there any user-facing changes?

Removal of 59 public trait methods, all of which were already #[deprecated] and none of which ever appeared in a published release. No Upgrade Guide entry is needed, because there is no released version anyone could be upgrading from that had this API.

…affolding

Deletes the 59 `#[deprecated(since = "55.0.0")]` methods from the
`PhysicalPlanNodeExt` trait. These were promoted from private inherent
methods to public trait methods by apache#21929 (merged after the 54.x line was
cut), so no released version of DataFusion ever exposed them. 55.0.0 would
have been the first release to ship them, already deprecated.

Also drops the imports that became unused (`DataSinkExec`,
`BoundedWindowAggExec`, `SortMergeJoinExecNode`) and the test that only
exercised the `try_into_projection_physical_plan` shim; `ProjectionExec`
encode/decode stays covered by the existing `roundtrip_test` cases.

No wire-format or dispatch changes.

Part of apache#23494.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@adriangb
adriangb force-pushed the claude/physicalplannodeext-deprecation-a0351c branch from d4c243f to 312a347 Compare August 11, 2026 13:52
@github-actions

Copy link
Copy Markdown

Thank you for opening this pull request!

Reviewer note: cargo-semver-checks reported the current version number is not SemVer-compatible with the changes in this pull request (compared against the base branch).

Details
     Cloning apache/main
    Building datafusion-proto v54.1.0 (current)
       Built [  71.752s] (current)
     Parsing datafusion-proto v54.1.0 (current)
      Parsed [   0.019s] (current)
    Building datafusion-proto v54.1.0 (baseline)
       Built [  62.213s] (baseline)
     Parsing datafusion-proto v54.1.0 (baseline)
      Parsed [   0.019s] (baseline)
    Checking datafusion-proto v54.1.0 -> v54.1.0 (no change; assume patch)
     Checked [   0.207s] 223 checks: 222 pass, 1 fail, 0 warn, 31 skip

--- failure trait_method_missing: pub trait method removed or renamed ---

Description:
A trait method is no longer callable, and may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#trait-item-signature
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.50.0/src/lints/trait_method_missing.ron

Failed in:
  method try_into_explain_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1287
  method try_into_projection_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1305
  method try_into_filter_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1332
  method try_into_csv_scan_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1353
  method try_into_json_scan_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1374
  method try_into_arrow_scan_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1395
  method try_into_parquet_scan_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1417
  method try_into_avro_scan_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1447
  method try_into_memory_scan_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1476
  method try_into_coalesce_batches_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1497
  method try_into_merge_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1524
  method try_into_repartition_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1545
  method try_into_global_limit_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1568
  method try_into_local_limit_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1591
  method try_into_window_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1614
  method try_into_aggregate_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1637
  method try_into_hash_join_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1660
  method try_into_symmetric_hash_join_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1683
  method try_into_union_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1706
  method try_into_interleave_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1727
  method try_into_cross_join_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1748
  method try_into_empty_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1771
  method try_into_placeholder_row_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1792
  method try_into_sort_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1815
  method try_into_sort_preserving_merge_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1836
  method try_into_nested_loop_join_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1881
  method try_into_analyze_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1904
  method try_into_json_sink_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1922
  method try_into_csv_sink_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1943
  method try_into_parquet_sink_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1965
  method try_into_unnest_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:1993
  method try_into_sort_join of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2020
  method try_into_cooperative_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2116
  method try_into_async_func_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2139
  method try_into_buffer_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2162
  method try_into_scalar_subquery_physical_plan of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2183
  method try_from_explain_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2206
  method try_from_projection_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2225
  method try_from_analyze_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2244
  method try_from_filter_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2263
  method try_from_global_limit_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2281
  method try_from_local_limit_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2300
  method try_from_hash_join_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2319
  method try_from_symmetric_hash_join_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2337
  method try_from_sort_merge_join_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2356
  method try_from_cross_join_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2375
  method try_from_aggregate_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2393
  method try_from_empty_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2411
  method try_from_placeholder_row_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2430
  method try_from_coalesce_batches_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2453
  method try_from_data_source_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2472
  method try_from_coalesce_partitions_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2489
  method try_from_repartition_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2508
  method try_from_sort_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2527
  method try_from_union_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2545
  method try_from_interleave_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2564
  method try_from_sort_preserving_merge_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2583
  method try_from_nested_loop_join_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2602
  method try_from_window_agg_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2621
  method try_from_bounded_window_agg_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2639
  method try_from_data_sink_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2658
  method try_from_unnest_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2675
  method try_from_cooperative_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2693
  method try_from_async_func_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2835
  method try_from_buffer_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2853
  method try_from_scalar_subquery_exec of trait PhysicalPlanNodeExt, previously in file /home/runner/work/datafusion/datafusion/target/semver-checks/git-apache_main/b231ded26fa2f210809267db52d571202113b3af/datafusion/proto/src/physical_plan/mod.rs:2871

     Summary semver requires new major version: 1 major and 0 minor checks failed
    Finished [ 136.408s] datafusion-proto

@github-actions github-actions Bot added the auto detected api change Auto detected API change label Aug 11, 2026
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 42.30769% with 45 lines in your changes missing coverage. Please review.
✅ Project coverage is 81.24%. Comparing base (3f0a953) to head (312a347).
⚠️ Report is 2 commits behind head on main.

Files with missing lines Patch % Lines
datafusion/proto/src/physical_plan/mod.rs 42.30% 41 Missing and 4 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #24269      +/-   ##
==========================================
+ Coverage   81.03%   81.24%   +0.20%     
==========================================
  Files        1107     1107              
  Lines      384477   383469    -1008     
  Branches   384477   383469    -1008     
==========================================
- Hits       311567   311539      -28     
+ Misses      54565    53572     -993     
- Partials    18345    18358      +13     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@alamb alamb left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like a good change to me

I had codex confirm this was added in

@alamb
alamb added this pull request to the merge queue Aug 11, 2026
Merged via the queue into apache:main with commit 7544051 Aug 11, 2026
37 checks passed
@adriangb
adriangb deleted the claude/physicalplannodeext-deprecation-a0351c branch August 11, 2026 19:21
kosiew pushed a commit to kosiew/datafusion that referenced this pull request Aug 12, 2026
…affolding (apache#24269)

## Which issue does this PR close?

- Part of apache#23494. This closes out that EPIC's "Remove the
`#[deprecated(since = "55.0.0")]` `PhysicalPlanNodeExt` scaffolding"
cleanup item.

## Rationale for this change

`PhysicalPlanNodeExt` currently carries 59 `#[deprecated(since =
"55.0.0")]` methods — per-operator `try_into_*_physical_plan` /
`try_from_*_exec` shims left behind by the `ExecutionPlan::try_to_proto`
/ `try_from_proto` migration. Each is a thin forwarder to the operator's
own hook; none is called by DataFusion.

**These methods have never shipped in any DataFusion release**, so no
deprecation window is owed:

- At the `54.1.0` tag they were **private inherent** methods on `impl
protobuf::PhysicalPlanNode` — not `pub`, not on a public trait:

  ```console
$ git show 54.1.0:datafusion/proto/src/physical_plan/mod.rs | sed -n
'700,701p'
  impl protobuf::PhysicalPlanNode {
      fn try_into_explain_physical_plan(
  ```

- apache#21929 (merge commit `077f08a9a6632324c95275dd15b5dd5b1f14006f`,
merged 2026-05-22) is what promoted them into the public
`PhysicalPlanNodeExt` trait, and it is **not** an ancestor of `54.1.0`
(54.1.0 was cut off the 54.0.x line):

  ```console
$ git merge-base --is-ancestor 077f08a
54.1.0; echo $?
  1
  ```

- Every one of them is marked `#[deprecated(since = "55.0.0")]`, so
55.0.0 would be the very first release to expose them — already
deprecated.

The [API health
policy](https://github.com/apache/datafusion/blob/main/docs/source/contributor-guide/api-health.md)
exists to protect API that users could have depended on *from a
release*. Nothing released ever exposed these. Deleting them before the
55.0.0 branch is cut avoids shipping 59 dead-on-arrival public methods
that we would then be obliged to carry for a full deprecation cycle.

Removing them also deletes ~1350 lines from
`datafusion/proto/src/physical_plan/mod.rs`, which makes the remaining,
load-bearing surface of the trait much easier to read.

## What changes are included in this PR?

- Delete the 59 `#[deprecated(since = "55.0.0")]` methods from
`PhysicalPlanNodeExt` (29 `try_from_*_exec` encoders, 30 `try_into_*`
decoders).
- Drop three `use` statements that became unused as a result:
`DataSinkExec`, `BoundedWindowAggExec`, `SortMergeJoinExecNode`.
- Delete `deprecated_projection_shim_decodes_argument_not_self`, the one
test that existed solely to pin the behaviour of the
`try_into_projection_physical_plan` shim.

Deliberately **not** changed:

- The trait itself and its 16 non-deprecated methods stay: `node()`,
`try_into_physical_plan_with_converter`,
`try_into_physical_plan_with_context`,
`try_from_physical_plan_with_converter`, the
scan/extension/generate-series decoders and `try_from_data_source_exec`
/ `try_from_lazy_memory_exec` that the central dispatch still calls.
- `AsExecutionPlan`, `PhysicalExtensionCodec`,
`PhysicalProtoConverterExtension` are untouched.
- **No `.proto` files and no encode/decode dispatch behaviour are
touched — the wire format is unchanged.**
- The `TryFromProto<&protobuf::{Json,Csv,Parquet}Sink>` impls in
`from_proto.rs` mentioned in apache#23494 are **not** removed here: they are
not marked `#[deprecated]` (there are no `deprecated` attributes
anywhere in `from_proto.rs` / `to_proto.rs`), so they don't fall under
the "never-released deprecated scaffolding" argument above and deserve
their own decision.

## Are these changes tested?

Covered by the existing test suite; the change is a pure deletion of
unreferenced code.

The one deleted test only exercised the deprecated shim. The underlying
`ProjectionExec::try_to_proto` / `ProjectionExec::try_from_proto` hook
keeps full roundtrip coverage through the existing `roundtrip_test`
cases in `datafusion/proto/tests/cases/roundtrip_physical_plan.rs` (e.g.
`roundtrip_like`, `roundtrip_projection_source`,
`roundtrip_empty_projection`).

Verified locally:

- `cargo fmt --all`
- `./ci/scripts/rust_clippy.sh` (CI's exact workspace + `--all-targets`
clippy, clean)
- `RUST_BACKTRACE=1 cargo test --profile ci -p datafusion-proto
--features avro,json` — 238 tests pass, 0 failures
- `cargo check -p datafusion-examples --examples` (two examples import
`PhysicalPlanNodeExt`; both only use methods that stay)
- `cargo doc -p datafusion-proto --no-deps` (no dangling intra-doc
links)

## Are there any user-facing changes?

Removal of 59 public trait methods, all of which were already
`#[deprecated]` and none of which ever appeared in a published release.
No Upgrade Guide entry is needed, because there is no released version
anyone could be upgrading *from* that had this API.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

auto detected api change Auto detected API change proto Related to proto crate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants