liwuhen opened a new pull request, #602:
URL: https://github.com/apache/paimon-rust/pull/602

   ### Purpose
   
   `TableWrite::write_arrow_batch` currently accepts an Arrow `RecordBatch`
   without validating that its schema matches the table's write contract.
   
   Malformed batches can therefore reach downstream writers. In particular, the
   dedicated BLOB and VECTOR writer assumes that input columns match the table
   schema and indexes them directly. A batch with missing fields can panic 
instead
   of returning a normal Paimon error.
   
   The empty-batch fast path also returns successfully before any downstream
   component can notice an invalid schema.
   
   This change validates the batch schema at the public table-write entry before
   the empty-batch fast path, row-kind enrichment, partition routing, or writer
   dispatch.
   
   Validation is performed in the following order:
   
   - Field count.
   - Field names and order.
   - Arrow data types.
   
   The accepted schemas are:
   
   - Normal writes accept exactly the table fields.
   - `changelog-producer=input` accepts either the table fields or the table
     fields followed by `_VALUE_KIND: Int8`.
   - Cross-partition and `rowkind.field` writes continue to accept only the 
table
     fields. Their internal `_VALUE_KIND` generation remains unchanged.
   
   Every schema mismatch returns `Error::DataInvalid` with expected and actual
   context for the first mismatch. No casting, field reordering, column 
insertion,
   or schema coercion is performed.
   
   ### Brief change log
   
   - Cache the table's expected Arrow write schema in `TableWrite` using the
     existing `build_target_arrow_schema` conversion.
   - Add a private schema validator to `TableWrite::write_arrow_batch`.
   - Run validation before the empty-batch fast path and writer dispatch.
   - Validate field count before names/order, and names/order before Arrow data
     types.
   - Allow an optional trailing `_VALUE_KIND: Int8` only for
     `changelog-producer=input`.
   - Reuse the cached Arrow schema when creating the dedicated-format writer.
   - Add regression coverage for:
     - Missing BLOB fields.
     - Missing VECTOR fields.
     - Reordered fields.
     - Incorrect field names.
     - Incorrect Arrow data types.
     - Unexpected extra columns.
     - `_VALUE_KIND` on normal writes.
     - Misplaced or incorrectly typed `_VALUE_KIND` on input changelog writes.
     - Invalid schemas on empty batches.
     - Caller-provided `_VALUE_KIND` in cross-partition and `rowkind.field`
       modes.
     - Valid normal, input changelog, cross-partition, and `rowkind.field`
       writes.
   
   ### Tests
   
   - Unit test `test_write_arrow_batch_rejects_missing_blob_field`
     (`table_write.rs`): verifies that a BLOB batch with a missing field returns
     `DataInvalid` instead of reaching the dedicated writer and panicking.
     **Fails on the pre-fix code.**
   - Unit test `test_write_arrow_batch_rejects_missing_vector_field`
     (`table_write.rs`): verifies the same behavior for a dedicated VECTOR
     writer. **Fails on the pre-fix code.**
   - Unit test `test_write_arrow_batch_rejects_mismatched_table_fields`
     (`table_write.rs`): covers field reordering, incorrect names, incorrect
     Arrow types, and unexpected columns.
   - Unit test `test_write_arrow_batch_rejects_invalid_empty_batch_schema`
     (`table_write.rs`): verifies that schema validation occurs before the empty
     batch fast path. **Fails on the pre-fix code.**
   - Unit test `test_normal_write_rejects_appended_value_kind`
     (`table_write.rs`): verifies that normal writes reject a caller-provided
     `_VALUE_KIND`.
   - Unit test
     `test_input_changelog_rejects_misplaced_or_wrong_type_value_kind`
     (`table_write.rs`): verifies that input changelog writes accept
     `_VALUE_KIND` only as the final `Int8` field.
   - Unit test
     `test_rowkind_field_accepts_table_schema_and_rejects_caller_value_kind`
     (`table_write.rs`): verifies that `rowkind.field` retains its existing
     caller schema contract and internal value-kind generation.
   - Unit test `test_cross_partition_write_rejects_caller_value_kind`
     (`table_write.rs`): verifies that cross-partition writes continue to accept
     only table fields.
   - Existing table-write tests verify valid normal, input changelog, and
     cross-partition writes.
   - Commands run locally:
     - `cargo test -p paimon --lib table_write`
     - `cargo test -p paimon --lib`
     - `cargo fmt --all --check`
     - `cargo check -p paimon --all-targets`
     - `cargo clippy -p paimon --all-targets -- -D warnings`
     - `git diff --check`
   
   ### API and Format
   
   No public API or persisted data format changes.
   
   The change only rejects Arrow batch schemas that do not satisfy the existing
   table-write contract. It does not cast, reorder, pad, or coerce input 
columns.
   
   Top-level Arrow field nullability and field metadata are not added to the
   validation contract. Existing schema evolution behavior is unchanged.
   
   Changelog, cross-partition, and `rowkind.field` semantics remain unchanged.
   The dedicated BLOB and VECTOR formats and their downstream writing logic are
   not modified.
   
   ### Documentation
   
   No documentation changes required.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to