linliu-code opened a new pull request, #657: URL: https://github.com/apache/hudi-rs/pull/657
**Stacked on #639–#655** — their commits appear here until they merge. **Review only the last commit.** ## What 19 merge-on-read layout fixtures, the gold comparison helper, and a test that reads each fixture and checks the result against the `SELECT *` snapshot Spark dumped **inside** it. So this asserts agreement with Hudi's reference reader, not with this reader's own prior output. The file slice is discovered from the extracted fixture rather than written down per case — a fixture that gains a file cannot silently stop being covered. ## Result: 4 of 15 read correctly | | | |---|---| | **Pass** | `log_only`, `log_compaction`, `parquet_log_block`, `partial_update` | | **Fail** | 11, each recorded with what stops it | | **No gold** | 2 (`delete_ord_int`, `hfile_log_block`) | **Every failure is in this crate's Avro-to-Arrow decoding, not in the merge:** ``` Decimal128(20, 2) not supported ×2 Decimal128(30, 15) not supported ×1 dictionary types other than UTF-8 ×1 Invalid magic / log format version ×3 union index out of bounds / negative len ×4 ``` The first four are outright rejections; the rest are that decoder losing framing on a payload it mis-reads. **`parquet_log_block` passes**, which places the gap in the Avro path specifically rather than in log-block handling. ## This corrects something I claimed earlier The port was landed on the premise that this crate's own `avro_to_arrow` could stand in for the forked `arrow-avro` upstream uses. It can for **schema conversion** — that is all the schema handler needed, and it works. It **cannot yet for decoding log block data**. That is why upstream moved to `arrow-avro`, and these fixtures are what surfaced it. The gap list is an `#[ignore]`d test rather than a comment, so a gap that starts passing **fails the assertion** and gets promoted into the passing set rather than going unnoticed. Run `cargo test -- --ignored --nocapture` to see it. ## One fix included The resolver now reads **`hoodie.record.merge.mode`**. A v9 table states its merge semantics in that key, and this crate reads it nowhere — it infers them from whether an ordering field is set. All 19 fixtures are `COMMIT_TIME_ORDERING` with **no ordering field**, so every one was inferred as `append_only` and refused. Same inference as #656, which shows it also silently drops deletes on the existing read path. Full workspace suite green (1105 passing, 1 ignored); build warning-free. 🤖 Generated with [Claude Code](https://claude.com/claude-code) -- 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]
