Skip to content

Destructure proto hooks for the Parquet source and sink #24620

Description

@adriangb

Scope

file type
datasource-parquet/src/source.rs ParquetSource
datasource-parquet/src/sink.rs ParquetSink

4 hooks (2 encoders, 2 decoders).

Field drop found in this group

ParquetSource::metadata_size_hint is not serialized. ParquetScanExecNode carries base_conf, predicate and parquet_options only, and the hint is not part of TableParquetOptions either, so a source configured with the public with_metadata_size_hint loses its footer prefetch size on round-trip.

Several other ParquetSource fields are unmentioned by the encoder and need an explicit decision: parquet_file_reader_factory and encryption_factory cannot be serialized and are rebuilt from the decode context (that is already documented on try_from_proto -- it should become a _ binding with the same note), while reverse_row_groups and sort_order_for_reorder need checking against how they are set.

Why

Serde hooks that read state through getters or self.field make an added field invisible to serialization: nothing breaks at compile time, the field simply stops round-tripping, and Debug-comparing round-trip tests do not notice. HashJoinExec::fetch was lost exactly this way (#24165), and #24609 is a second live instance found by applying the convention to one file.

#24164 established the fix -- exhaustive destructuring in both directions -- and applied it to the join plans. The physical-plan plan nodes are done. physical-expr and the datasource* crates were never converted.

What to do

For each hook in scope:

  1. In try_to_proto, start with an exhaustive let Self {{ .. }} -- no .. rest pattern. Fields that are genuinely not serialized bind to _ with a short comment saying why (derived at construction, runtime state, recomputed on decode, carried by a parent message).
  2. In try_from_proto, destructure the prost-generated node struct the same way, so adding a field to datafusion.proto is a compile error in every decoder.
  3. If the destructure turns up a field that should round-trip but has no wire representation, add it to the message and cover it with a test that fails without the fix.

Definition of done

Metadata

Metadata

Assignees

Labels

protoRelated to proto crate

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions