Skip to content

feat: Introduce Deduplicator trait to unify mutable and immutable deduplication - #1537

Merged
OussamaSaoudi merged 5 commits into
delta-io:mainfrom
OussamaSaoudi:stack/dlr_add_rm_dedup
Jan 16, 2026
Merged

feat: Introduce Deduplicator trait to unify mutable and immutable deduplication#1537
OussamaSaoudi merged 5 commits into
delta-io:mainfrom
OussamaSaoudi:stack/dlr_add_rm_dedup

Conversation

@OussamaSaoudi

@OussamaSaoudi OussamaSaoudi commented Dec 3, 2025

Copy link
Copy Markdown
Collaborator

🥞 Stacked PR

Use this link to review incremental changes.


What changes are proposed in this pull request?

This PR introduces the Deduplicator trait which will unify Commit and Checkpoint deduplication under a single API. This is done to move the &mut HashSet<..> out of AddRemoveDedup and behind the Deduplicator trait. That way, we can reuse AddRemoveDedupVisitor in an immutable scenario.

How was this change tested?

@codecov

codecov Bot commented Dec 3, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 80.55556% with 7 lines in your changes missing coverage. Please review.
✅ Project coverage is 84.16%. Comparing base (743edec) to head (89e34bc).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
kernel/src/log_replay/deduplicator.rs 82.35% 0 Missing and 3 partials ⚠️
kernel/src/expressions/mod.rs 66.66% 2 Missing ⚠️
kernel/src/scan/log_replay.rs 80.00% 0 Missing and 2 partials ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##             main    #1537   +/-   ##
=======================================
  Coverage   84.16%   84.16%           
=======================================
  Files         121      122    +1     
  Lines       34131    34108   -23     
  Branches    34131    34108   -23     
=======================================
- Hits        28726    28707   -19     
+ Misses       4017     4013    -4     
  Partials     1388     1388           

☔ View full report in Codecov by Sentry.
📢 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.

@github-actions github-actions Bot added the breaking-change Public API change that could cause downstream compilation failures. Requires a major version bump. label Dec 3, 2025
@OussamaSaoudi OussamaSaoudi changed the title extract file deduplicator feat: Introduce Deduplicator trait to unify mutable and immutable deduplication Dec 4, 2025
Comment on lines -233 to -240
// These index positions correspond to the order of columns defined in
// `selected_column_names_and_types()`
const ADD_PATH_INDEX: usize = 0; // Position of "add.path" in getters
const ADD_PARTITION_VALUES_INDEX: usize = 1; // Position of "add.partitionValues" in getters
const ADD_DV_START_INDEX: usize = 2; // Start position of add deletion vector columns
const BASE_ROW_ID_INDEX: usize = 5; // Position of add.baseRowId in getters
const REMOVE_PATH_INDEX: usize = 6; // Position of "remove.path" in getters
const REMOVE_DV_START_INDEX: usize = 7; // Start position of remove deletion vector columns

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Note: these are moved out because (annoyingly), rust expects a proper type AddRemoveDedupVisitor::<FileActionDeduplicator>::ADD_PATH_INDEX

Comment thread kernel/src/log_replay.rs
}
}

impl<'seen> Deduplicator for FileActionDeduplicator<'seen> {

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

NOTE: this just moves it to the Deduplicator impl block.

@scovich scovich Dec 16, 2025

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Is the named lifetime actually used inside the impl block (guessing not, because trait impl)?
If not, can use anonymous lifetime here?

Comment on lines +85 to +90
const ADD_PATH_INDEX: usize = 0; // Position of "add.path" in getters
const ADD_PARTITION_VALUES_INDEX: usize = 1; // Position of "add.partitionValues" in getters
const ADD_DV_START_INDEX: usize = 2; // Start position of add deletion vector columns
const BASE_ROW_ID_INDEX: usize = 5; // Position of add.baseRowId in getters
const REMOVE_PATH_INDEX: usize = 6; // Position of "remove.path" in getters
const REMOVE_DV_START_INDEX: usize = 7; // Start position of remove deletion vector columns

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Note: these are moved here because (annoyingly), rust expects a proper type AddRemoveDedupVisitor::::ADD_PATH_INDEX

@OussamaSaoudi
OussamaSaoudi marked this pull request as ready for review December 4, 2025 01:15
Comment thread kernel/src/log_replay.rs
/// - `Ok(None)`: When no file action is found
/// - `Err(...)`: On any error during extraction
pub(crate) fn extract_file_action<'a>(
fn extract_file_action<'a>(

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Here because of unnecessary visibility specifiers from trait Deduplicator.

//! actions selected
//!
use crate::engine_data::{FilteredEngineData, GetData, RowVisitor, TypedGetData as _};
use crate::log_replay::deduplicator::Deduplicator;

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

imported to have access to the trait's check_record_and_seen

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

as _ can be used to clearly state that

/// - `dv_start_index` retrieves the storage type (`deletionVector.storageType`).
/// - `dv_start_index + 1` retrieves the path or inline deletion vector (`deletionVector.pathOrInlineDv`).
/// - `dv_start_index + 2` retrieves the optional offset (`deletionVector.offset`).
fn extract_dv_unique_id<'a>(

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Moved this directly from FileActionDeduplicator.

@OussamaSaoudi
OussamaSaoudi force-pushed the stack/dlr_add_rm_dedup branch from d71a38d to 9312426 Compare December 8, 2025 21:28
Comment thread kernel/src/log_replay/deduplicator.rs Outdated

pub(crate) trait Deduplicator {
/// Key type for identifying file actions.
type Key;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Does the key actually change? The trait name sounds generic enough, but then methods like extract_file_action sound quite specific to file actions and scan replay?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

True. I'd initially wanted to use Deduplicator::Key to allow CheckpointDeduplicator use String. But String ended up complex enough to just keep it as FileActionKey.

I'll change to make the type fixed.

fn check_and_record_seen(&mut self, key: Self::Key) -> bool;

/// Returns `true` for commit log batches (updates hashmap), `false` for checkpoints (read-only).
fn is_log_batch(&self) -> bool;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Should this be an associated constant? If we're ever doing checkpoint replay, we should be using a read-only deduplicator.

Tho that begs the question -- who actually cares (outside the trait impl itself) whether a given batch is from a commit or checkpoint? Is this all a vestige of the original code warts the Deduplicator trait tries to fix?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Yep this is still used a few places in AddRemoveDedupVisitor that uses is_log_batch, so it's vestigial until we move over the code in scan_metadata.

Comment thread kernel/src/log_replay/deduplicator.rs Outdated
Comment on lines +51 to +64
match getters[dv_start_index].get_opt(i, "deletionVector.storageType")? {
Some(storage_type) => {
let path_or_inline =
getters[dv_start_index + 1].get(i, "deletionVector.pathOrInlineDv")?;
let offset = getters[dv_start_index + 2].get_opt(i, "deletionVector.offset")?;

Ok(Some(DeletionVectorDescriptor::unique_id_from_parts(
storage_type,
path_or_inline,
offset,
)))
}
None => Ok(None),
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

let Some(storage_type) = getters... else {
    return Ok(None);
};

let path_or_inline = ...?;
let offset = ...?;
Ok(Some(...))

@scovich scovich left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, few nits

@OussamaSaoudi
OussamaSaoudi force-pushed the stack/dlr_add_rm_dedup branch 2 times, most recently from 6a19624 to 06fdf84 Compare December 17, 2025 02:13
OussamaSaoudi added a commit that referenced this pull request Dec 17, 2025
## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1500/files) to
review incremental changes.
-
[**stack/dlr_manifest**](#1500)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1500/files)]
-
[stack/dlr_driver](#1502)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1502/files/2f0a14caf7cd1070625525868e18da9c300b8a0f..4285e9c8ae504fe697b83f4719c0e0995e0e3bd1)]
-
[stack/dlr_serialization_helpers](#1543)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1543/files/4285e9c8ae504fe697b83f4719c0e0995e0e3bd1..60f13ec6ee1f7cc2b57006a09d4b0e82b59733b9)]
-
[stack/dlr_serde](#1503)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1503/files/60f13ec6ee1f7cc2b57006a09d4b0e82b59733b9..377ae3f2596116d00cba596268090d2f69118b2e)]
-
[stack/dlr_add_rm_dedup](#1537)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1537/files/377ae3f2596116d00cba596268090d2f69118b2e..06fdf84431d7ee9cf693149784b11e4afb242de1)]
-
[stack/dlr_immutable_add_rm_dedup](#1538)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1538/files/06fdf84431d7ee9cf693149784b11e4afb242de1..991cdd69f18eb680dbafae3c213093b036cb7a85)]
-
[stack/dlr_leaf](#1501)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1501/files/991cdd69f18eb680dbafae3c213093b036cb7a85..1f52bbc6512d7cb0a5e2a68954eb434be7313ef0)]
-
[stack/dlr_executor](#1539)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1539/files/1f52bbc6512d7cb0a5e2a68954eb434be7313ef0..9a4f638d613121fe5819e3fef6c03b3e5102ab73)]
- [stack/dlr_api](#1547)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1547/files/9a4f638d613121fe5819e3fef6c03b3e5102ab73..f385656ab1aa1f34caf77fa8518834d0ac0b998c)]
-
[stack/dlr_scan_state_serde](#1549)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1549/files/f385656ab1aa1f34caf77fa8518834d0ac0b998c..ac99eeec1f5d19fe76e8589f87cf53a7aa140e54)]

---------

This PR adds a CheckpointManifestReader that is responsible for reading
both manifest checkpoints and single-part checkpoints. For manifest
checkpoints, it collects all the sidecar files that are present and
returns them for further processing.
OussamaSaoudi added a commit that referenced this pull request Dec 17, 2025
## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1502/files) to
review incremental changes.
-
[**stack/dlr_driver**](#1502)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1502/files)]
-
[stack/dlr_serialization_helpers](#1543)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1543/files/8f86b459613c0f018dd0e45473ba3e6e50d127af..0286f1d09006b099e73333c3d2d6a0873ede6cdd)]
-
[stack/dlr_serde](#1503)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1503/files/0286f1d09006b099e73333c3d2d6a0873ede6cdd..ee68c851e338a83584b004d919c40eca301e2ee3)]
-
[stack/dlr_add_rm_dedup](#1537)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1537/files/ee68c851e338a83584b004d919c40eca301e2ee3..436ce448e2dbf08ceb8f13350cb609ae3f554a7c)]
-
[stack/dlr_immutable_add_rm_dedup](#1538)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1538/files/436ce448e2dbf08ceb8f13350cb609ae3f554a7c..b2c2703bef78ef814c0579e82857cd67a2d1364b)]
-
[stack/dlr_leaf](#1501)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1501/files/b2c2703bef78ef814c0579e82857cd67a2d1364b..5f04e2059209c09a3ac8f5981d018347829bd8ab)]
-
[stack/dlr_executor](#1539)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1539/files/5f04e2059209c09a3ac8f5981d018347829bd8ab..7e2d26a6b063927e8b9a9fa62043ad30c705cc43)]
- [stack/dlr_api](#1547)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1547/files/7e2d26a6b063927e8b9a9fa62043ad30c705cc43..b608475ed1402d8640b89e5948d066e0867585b3)]
-
[stack/dlr_scan_state_serde](#1549)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1549/files/b608475ed1402d8640b89e5948d066e0867585b3..c35994fbf457ed95556acc7688456feb81923abf)]

---------
## What changes are proposed in this pull request?

This pull request introduces the SequentialPhase for distributed log
replay. This phase reads the commit and checkpoint files for a
logsegment and performs the log replay processor over the batches.

Upon completion, the `finish` method produces `AfterSequential` which
has two variants:
* `Done`: Indicates that the metadata phase is complete and there is no
more work to do.
* `Distributed`: Indicates that a distributed phase is required (see the
pr at stack/dlr_executor)

## How was this change tested?
Ensure that the sequential phase extracts the expected actions for:
* commits
* single-part checkpoints

Ensure that sequential phase produces `AfterSequential::Distributed` in
the presence of:
* sidecar files in a manifest checkpoint
* multi-part checkpoints

@nicklan nicklan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

i think i've ignored the serde stuff successfully and this part lgtm :)

Comment thread kernel/src/expressions/mod.rs Outdated
@OussamaSaoudi
OussamaSaoudi force-pushed the stack/dlr_add_rm_dedup branch 2 times, most recently from 0fcd32f to c976a3a Compare December 19, 2025 22:13
roeap pushed a commit to roeap/delta-kernel-rs that referenced this pull request Jan 8, 2026
## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1499/files) to
review incremental changes.
-
[**stack/dlr_commit**](delta-io#1499)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1499/files)]
-
[stack/dlr_manifest](delta-io#1500)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1500/files/69a8312ad609546d2fbfac74f9d9082108bca41e..41eba152cc46b0ab3c4daf5ba11d80d5b52e4975)]
-
[stack/dlr_driver](delta-io#1502)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1502/files/41eba152cc46b0ab3c4daf5ba11d80d5b52e4975..6227645580128ccd91946416e5fbb15ed46e3f64)]
-
[stack/dlr_serialization_helpers](delta-io#1543)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1543/files/6227645580128ccd91946416e5fbb15ed46e3f64..2e700abd0d6e12553819285b311c4ba1c49b4bf1)]
-
[stack/dlr_serde](delta-io#1503)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1503/files/2e700abd0d6e12553819285b311c4ba1c49b4bf1..c016ad815161e6d44e7280c194b3407f3322905f)]
-
[stack/dlr_add_rm_dedup](delta-io#1537)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1537/files/c016ad815161e6d44e7280c194b3407f3322905f..61f0908590d905f97ee8052aadaa5b64f74fc4de)]
-
[stack/dlr_immutable_add_rm_dedup](delta-io#1538)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1538/files/61f0908590d905f97ee8052aadaa5b64f74fc4de..6865ff9760fa5716bc75d92cef9d43422804118d)]
-
[stack/dlr_leaf](delta-io#1501)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1501/files/6865ff9760fa5716bc75d92cef9d43422804118d..8d59594b63db32fdf208026f8784b7622675e3d8)]
-
[stack/dlr_executor](delta-io#1539)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1539/files/8d59594b63db32fdf208026f8784b7622675e3d8..cb2a8c4f06d8aa412cc649348f6467b15bae2a9b)]
- [stack/dlr_api](delta-io#1547)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1547/files/a3566ba6f3631224516b92238285ebe49626da01..4b6f568d2a6b57ac01af6264921a5ba6b2567abc)]
-
[stack/dlr_scan_state_serde](delta-io#1549)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1549/files/4b6f568d2a6b57ac01af6264921a5ba6b2567abc..be1183715647d39952529083bbb51c2266530f58)]

---------
<!--
Thanks for sending a pull request!  Here are some tips for you:
1. If this is your first time, please read our contributor guidelines:
https://github.com/delta-incubator/delta-kernel-rs/blob/main/CONTRIBUTING.md
2. Run `cargo t --all-features --all-targets` to get started testing,
and run `cargo fmt`.
  3. Ensure you have added or run the appropriate tests for your PR.
4. If the PR is unfinished, add '[WIP]' in your PR title, e.g., '[WIP]
Your PR title ...'.
  5. Be sure to keep the PR description updated to reflect all changes.
-->

<!--
PR title formatting:
This project uses conventional commits:
https://www.conventionalcommits.org/

Each PR corresponds to a commit on the `main` branch, with the title of
the PR (typically) being
used for the commit message on main. In order to ensure proper
formatting in the CHANGELOG please
ensure your PR title adheres to the conventional commit specification.

Examples:
- new feature PR: "feat: new API for snapshot.update()"
- bugfix PR: "fix: correctly apply DV in read-table example"
-->

## What changes are proposed in this pull request?
<!--
Please clarify what changes you are proposing and why the changes are
needed.
The purpose of this section is to outline the changes, why they are
needed, and how this PR fixes the issue.
If the reason for the change is already explained clearly in an issue,
then it does not need to be restated here.
1. If you propose a new API or feature, clarify the use case for a new
API or feature.
  2. If you fix a bug, you can clarify why it is a bug.
-->
This PR adds the commit logreader, a module that will hold all the logic
for processing commit files when performing log replay.
* CommitReader reads the delta log using the commit cover.
* CommitReader implements `Iterator<Item = ActionBatch>`.
* CommitReader can read using an arbitrary log schema.
<!--
Uncomment this section if there are any changes affecting public APIs:
### This PR affects the following public APIs

If there are breaking changes, please ensure the `breaking-changes`
label gets added by CI, and describe why the changes are needed.

Note that _new_ public APIs are not considered breaking.
-->


## How was this change tested?
<!--
Please make sure to add test cases that check the changes thoroughly
including negative and positive cases if possible.
If it was tested in a way different from regular unit tests, please
clarify how you tested, ideally via a reproducible test documented in
the PR description.
-->

This is tested with the `app-txn-no-checkpoint` which has multiple
commits and multiple add actions in each commit. We ensure that the
CommitReader reads the correct set of add actions.
roeap pushed a commit to roeap/delta-kernel-rs that referenced this pull request Jan 8, 2026
…#1500)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1500/files) to
review incremental changes.
-
[**stack/dlr_manifest**](delta-io#1500)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1500/files)]
-
[stack/dlr_driver](delta-io#1502)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1502/files/2f0a14caf7cd1070625525868e18da9c300b8a0f..4285e9c8ae504fe697b83f4719c0e0995e0e3bd1)]
-
[stack/dlr_serialization_helpers](delta-io#1543)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1543/files/4285e9c8ae504fe697b83f4719c0e0995e0e3bd1..60f13ec6ee1f7cc2b57006a09d4b0e82b59733b9)]
-
[stack/dlr_serde](delta-io#1503)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1503/files/60f13ec6ee1f7cc2b57006a09d4b0e82b59733b9..377ae3f2596116d00cba596268090d2f69118b2e)]
-
[stack/dlr_add_rm_dedup](delta-io#1537)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1537/files/377ae3f2596116d00cba596268090d2f69118b2e..06fdf84431d7ee9cf693149784b11e4afb242de1)]
-
[stack/dlr_immutable_add_rm_dedup](delta-io#1538)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1538/files/06fdf84431d7ee9cf693149784b11e4afb242de1..991cdd69f18eb680dbafae3c213093b036cb7a85)]
-
[stack/dlr_leaf](delta-io#1501)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1501/files/991cdd69f18eb680dbafae3c213093b036cb7a85..1f52bbc6512d7cb0a5e2a68954eb434be7313ef0)]
-
[stack/dlr_executor](delta-io#1539)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1539/files/1f52bbc6512d7cb0a5e2a68954eb434be7313ef0..9a4f638d613121fe5819e3fef6c03b3e5102ab73)]
- [stack/dlr_api](delta-io#1547)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1547/files/9a4f638d613121fe5819e3fef6c03b3e5102ab73..f385656ab1aa1f34caf77fa8518834d0ac0b998c)]
-
[stack/dlr_scan_state_serde](delta-io#1549)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1549/files/f385656ab1aa1f34caf77fa8518834d0ac0b998c..ac99eeec1f5d19fe76e8589f87cf53a7aa140e54)]

---------

This PR adds a CheckpointManifestReader that is responsible for reading
both manifest checkpoints and single-part checkpoints. For manifest
checkpoints, it collects all the sidecar files that are present and
returns them for further processing.
roeap pushed a commit to roeap/delta-kernel-rs that referenced this pull request Jan 8, 2026
## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1502/files) to
review incremental changes.
-
[**stack/dlr_driver**](delta-io#1502)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1502/files)]
-
[stack/dlr_serialization_helpers](delta-io#1543)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1543/files/8f86b459613c0f018dd0e45473ba3e6e50d127af..0286f1d09006b099e73333c3d2d6a0873ede6cdd)]
-
[stack/dlr_serde](delta-io#1503)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1503/files/0286f1d09006b099e73333c3d2d6a0873ede6cdd..ee68c851e338a83584b004d919c40eca301e2ee3)]
-
[stack/dlr_add_rm_dedup](delta-io#1537)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1537/files/ee68c851e338a83584b004d919c40eca301e2ee3..436ce448e2dbf08ceb8f13350cb609ae3f554a7c)]
-
[stack/dlr_immutable_add_rm_dedup](delta-io#1538)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1538/files/436ce448e2dbf08ceb8f13350cb609ae3f554a7c..b2c2703bef78ef814c0579e82857cd67a2d1364b)]
-
[stack/dlr_leaf](delta-io#1501)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1501/files/b2c2703bef78ef814c0579e82857cd67a2d1364b..5f04e2059209c09a3ac8f5981d018347829bd8ab)]
-
[stack/dlr_executor](delta-io#1539)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1539/files/5f04e2059209c09a3ac8f5981d018347829bd8ab..7e2d26a6b063927e8b9a9fa62043ad30c705cc43)]
- [stack/dlr_api](delta-io#1547)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1547/files/7e2d26a6b063927e8b9a9fa62043ad30c705cc43..b608475ed1402d8640b89e5948d066e0867585b3)]
-
[stack/dlr_scan_state_serde](delta-io#1549)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1549/files/b608475ed1402d8640b89e5948d066e0867585b3..c35994fbf457ed95556acc7688456feb81923abf)]

---------
## What changes are proposed in this pull request?

This pull request introduces the SequentialPhase for distributed log
replay. This phase reads the commit and checkpoint files for a
logsegment and performs the log replay processor over the batches.

Upon completion, the `finish` method produces `AfterSequential` which
has two variants:
* `Done`: Indicates that the metadata phase is complete and there is no
more work to do.
* `Distributed`: Indicates that a distributed phase is required (see the
pr at stack/dlr_executor)

## How was this change tested?
Ensure that the sequential phase extracts the expected actions for:
* commits
* single-part checkpoints

Ensure that sequential phase produces `AfterSequential::Distributed` in
the presence of:
* sidecar files in a manifest checkpoint
* multi-part checkpoints
emkornfield pushed a commit to emkornfield/delta-kernel-rs that referenced this pull request Jan 8, 2026
…#1500)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1500/files) to
review incremental changes.
-
[**stack/dlr_manifest**](delta-io#1500)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1500/files)]
-
[stack/dlr_driver](delta-io#1502)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1502/files/2f0a14caf7cd1070625525868e18da9c300b8a0f..4285e9c8ae504fe697b83f4719c0e0995e0e3bd1)]
-
[stack/dlr_serialization_helpers](delta-io#1543)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1543/files/4285e9c8ae504fe697b83f4719c0e0995e0e3bd1..60f13ec6ee1f7cc2b57006a09d4b0e82b59733b9)]
-
[stack/dlr_serde](delta-io#1503)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1503/files/60f13ec6ee1f7cc2b57006a09d4b0e82b59733b9..377ae3f2596116d00cba596268090d2f69118b2e)]
-
[stack/dlr_add_rm_dedup](delta-io#1537)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1537/files/377ae3f2596116d00cba596268090d2f69118b2e..06fdf84431d7ee9cf693149784b11e4afb242de1)]
-
[stack/dlr_immutable_add_rm_dedup](delta-io#1538)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1538/files/06fdf84431d7ee9cf693149784b11e4afb242de1..991cdd69f18eb680dbafae3c213093b036cb7a85)]
-
[stack/dlr_leaf](delta-io#1501)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1501/files/991cdd69f18eb680dbafae3c213093b036cb7a85..1f52bbc6512d7cb0a5e2a68954eb434be7313ef0)]
-
[stack/dlr_executor](delta-io#1539)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1539/files/1f52bbc6512d7cb0a5e2a68954eb434be7313ef0..9a4f638d613121fe5819e3fef6c03b3e5102ab73)]
- [stack/dlr_api](delta-io#1547)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1547/files/9a4f638d613121fe5819e3fef6c03b3e5102ab73..f385656ab1aa1f34caf77fa8518834d0ac0b998c)]
-
[stack/dlr_scan_state_serde](delta-io#1549)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1549/files/f385656ab1aa1f34caf77fa8518834d0ac0b998c..ac99eeec1f5d19fe76e8589f87cf53a7aa140e54)]

---------

This PR adds a CheckpointManifestReader that is responsible for reading
both manifest checkpoints and single-part checkpoints. For manifest
checkpoints, it collects all the sidecar files that are present and
returns them for further processing.
emkornfield pushed a commit to emkornfield/delta-kernel-rs that referenced this pull request Jan 8, 2026
## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1502/files) to
review incremental changes.
-
[**stack/dlr_driver**](delta-io#1502)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1502/files)]
-
[stack/dlr_serialization_helpers](delta-io#1543)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1543/files/8f86b459613c0f018dd0e45473ba3e6e50d127af..0286f1d09006b099e73333c3d2d6a0873ede6cdd)]
-
[stack/dlr_serde](delta-io#1503)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1503/files/0286f1d09006b099e73333c3d2d6a0873ede6cdd..ee68c851e338a83584b004d919c40eca301e2ee3)]
-
[stack/dlr_add_rm_dedup](delta-io#1537)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1537/files/ee68c851e338a83584b004d919c40eca301e2ee3..436ce448e2dbf08ceb8f13350cb609ae3f554a7c)]
-
[stack/dlr_immutable_add_rm_dedup](delta-io#1538)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1538/files/436ce448e2dbf08ceb8f13350cb609ae3f554a7c..b2c2703bef78ef814c0579e82857cd67a2d1364b)]
-
[stack/dlr_leaf](delta-io#1501)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1501/files/b2c2703bef78ef814c0579e82857cd67a2d1364b..5f04e2059209c09a3ac8f5981d018347829bd8ab)]
-
[stack/dlr_executor](delta-io#1539)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1539/files/5f04e2059209c09a3ac8f5981d018347829bd8ab..7e2d26a6b063927e8b9a9fa62043ad30c705cc43)]
- [stack/dlr_api](delta-io#1547)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1547/files/7e2d26a6b063927e8b9a9fa62043ad30c705cc43..b608475ed1402d8640b89e5948d066e0867585b3)]
-
[stack/dlr_scan_state_serde](delta-io#1549)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1549/files/b608475ed1402d8640b89e5948d066e0867585b3..c35994fbf457ed95556acc7688456feb81923abf)]

---------
## What changes are proposed in this pull request?

This pull request introduces the SequentialPhase for distributed log
replay. This phase reads the commit and checkpoint files for a
logsegment and performs the log replay processor over the batches.

Upon completion, the `finish` method produces `AfterSequential` which
has two variants:
* `Done`: Indicates that the metadata phase is complete and there is no
more work to do.
* `Distributed`: Indicates that a distributed phase is required (see the
pr at stack/dlr_executor)

## How was this change tested?
Ensure that the sequential phase extracts the expected actions for:
* commits
* single-part checkpoints

Ensure that sequential phase produces `AfterSequential::Distributed` in
the presence of:
* sidecar files in a manifest checkpoint
* multi-part checkpoints
Fokko pushed a commit to Fokko/delta-kernel-rs that referenced this pull request Jan 9, 2026
* feat: Add CheckpointManifestReader to process sidecar files (delta-io#1500)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1500/files) to
review incremental changes.
-
[**stack/dlr_manifest**](delta-io#1500)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1500/files)]
-
[stack/dlr_driver](delta-io#1502)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1502/files/2f0a14caf7cd1070625525868e18da9c300b8a0f..4285e9c8ae504fe697b83f4719c0e0995e0e3bd1)]
-
[stack/dlr_serialization_helpers](delta-io#1543)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1543/files/4285e9c8ae504fe697b83f4719c0e0995e0e3bd1..60f13ec6ee1f7cc2b57006a09d4b0e82b59733b9)]
-
[stack/dlr_serde](delta-io#1503)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1503/files/60f13ec6ee1f7cc2b57006a09d4b0e82b59733b9..377ae3f2596116d00cba596268090d2f69118b2e)]
-
[stack/dlr_add_rm_dedup](delta-io#1537)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1537/files/377ae3f2596116d00cba596268090d2f69118b2e..06fdf84431d7ee9cf693149784b11e4afb242de1)]
-
[stack/dlr_immutable_add_rm_dedup](delta-io#1538)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1538/files/06fdf84431d7ee9cf693149784b11e4afb242de1..991cdd69f18eb680dbafae3c213093b036cb7a85)]
-
[stack/dlr_leaf](delta-io#1501)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1501/files/991cdd69f18eb680dbafae3c213093b036cb7a85..1f52bbc6512d7cb0a5e2a68954eb434be7313ef0)]
-
[stack/dlr_executor](delta-io#1539)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1539/files/1f52bbc6512d7cb0a5e2a68954eb434be7313ef0..9a4f638d613121fe5819e3fef6c03b3e5102ab73)]
- [stack/dlr_api](delta-io#1547)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1547/files/9a4f638d613121fe5819e3fef6c03b3e5102ab73..f385656ab1aa1f34caf77fa8518834d0ac0b998c)]
-
[stack/dlr_scan_state_serde](delta-io#1549)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1549/files/f385656ab1aa1f34caf77fa8518834d0ac0b998c..ac99eeec1f5d19fe76e8589f87cf53a7aa140e54)]

---------

This PR adds a CheckpointManifestReader that is responsible for reading
both manifest checkpoints and single-part checkpoints. For manifest
checkpoints, it collects all the sidecar files that are present and
returns them for further processing.

* feat: Distributed Log Replay Sequential Phase (delta-io#1502)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1502/files) to
review incremental changes.
-
[**stack/dlr_driver**](delta-io#1502)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1502/files)]
-
[stack/dlr_serialization_helpers](delta-io#1543)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1543/files/8f86b459613c0f018dd0e45473ba3e6e50d127af..0286f1d09006b099e73333c3d2d6a0873ede6cdd)]
-
[stack/dlr_serde](delta-io#1503)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1503/files/0286f1d09006b099e73333c3d2d6a0873ede6cdd..ee68c851e338a83584b004d919c40eca301e2ee3)]
-
[stack/dlr_add_rm_dedup](delta-io#1537)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1537/files/ee68c851e338a83584b004d919c40eca301e2ee3..436ce448e2dbf08ceb8f13350cb609ae3f554a7c)]
-
[stack/dlr_immutable_add_rm_dedup](delta-io#1538)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1538/files/436ce448e2dbf08ceb8f13350cb609ae3f554a7c..b2c2703bef78ef814c0579e82857cd67a2d1364b)]
-
[stack/dlr_leaf](delta-io#1501)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1501/files/b2c2703bef78ef814c0579e82857cd67a2d1364b..5f04e2059209c09a3ac8f5981d018347829bd8ab)]
-
[stack/dlr_executor](delta-io#1539)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1539/files/5f04e2059209c09a3ac8f5981d018347829bd8ab..7e2d26a6b063927e8b9a9fa62043ad30c705cc43)]
- [stack/dlr_api](delta-io#1547)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1547/files/7e2d26a6b063927e8b9a9fa62043ad30c705cc43..b608475ed1402d8640b89e5948d066e0867585b3)]
-
[stack/dlr_scan_state_serde](delta-io#1549)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1549/files/b608475ed1402d8640b89e5948d066e0867585b3..c35994fbf457ed95556acc7688456feb81923abf)]

---------
## What changes are proposed in this pull request?

This pull request introduces the SequentialPhase for distributed log
replay. This phase reads the commit and checkpoint files for a
logsegment and performs the log replay processor over the batches.

Upon completion, the `finish` method produces `AfterSequential` which
has two variants:
* `Done`: Indicates that the metadata phase is complete and there is no
more work to do.
* `Distributed`: Indicates that a distributed phase is required (see the
pr at stack/dlr_executor)

## How was this change tested?
Ensure that the sequential phase extracts the expected actions for:
* commits
* single-part checkpoints

Ensure that sequential phase produces `AfterSequential::Distributed` in
the presence of:
* sidecar files in a manifest checkpoint
* multi-part checkpoints

* feat/bugfix: Passing schema from C, plus example/tests in C (delta-io#1535)

## What changes are proposed in this pull request?
* Don't use a macro to generate primitive visitors. `cbindgen` runs
before macro expansion, so previously none of those visitors were
actually being generated
* Add code to `read_table` to allow specifying which columns to select,
plus all the associated code to pass that back to kernel
* Add c based tests to make sure it's working


## How was this change tested?
New tests when running `make test` in `read_table`

---------

Co-authored-by: OussamaSaoudi <45303303+OussamaSaoudi@users.noreply.github.com>

* feat!: expose mod time in scan metadata callbacks (delta-io#1565)

* feat: Support sidecar in inspect-table (delta-io#1566)

<!--
Thanks for sending a pull request!  Here are some tips for you:
1. If this is your first time, please read our contributor guidelines:
https://github.com/delta-incubator/delta-kernel-rs/blob/main/CONTRIBUTING.md
2. Run `cargo t --all-features --all-targets` to get started testing,
and run `cargo fmt`.
  3. Ensure you have added or run the appropriate tests for your PR.
4. If the PR is unfinished, add '[WIP]' in your PR title, e.g., '[WIP]
Your PR title ...'.
  5. Be sure to keep the PR description updated to reflect all changes.
-->

<!--
PR title formatting:
This project uses conventional commits:
https://www.conventionalcommits.org/

Each PR corresponds to a commit on the `main` branch, with the title of
the PR (typically) being
used for the commit message on main. In order to ensure proper
formatting in the CHANGELOG please
ensure your PR title adheres to the conventional commit specification.

Examples:
- new feature PR: "feat: new API for snapshot.update()"
- bugfix PR: "fix: correctly apply DV in read-table example"
-->

## What changes are proposed in this pull request?
<!--
Please clarify what changes you are proposing and why the changes are
needed.
The purpose of this section is to outline the changes, why they are
needed, and how this PR fixes the issue.
If the reason for the change is already explained clearly in an issue,
then it does not need to be restated here.
1. If you propose a new API or feature, clarify the use case for a new
API or feature.
  2. If you fix a bug, you can clarify why it is a bug.
-->
Support sidecar in inspect-table.
Solves the issue delta-io#695.
<!--
Uncomment this section if there are any changes affecting public APIs:
### This PR affects the following public APIs

If there are breaking changes, please ensure the `breaking-changes`
label gets added by CI, and describe why the changes are needed.

Note that _new_ public APIs are not considered breaking.
-->


## How was this change tested?
<!--
Please make sure to add test cases that check the changes thoroughly
including negative and positive cases if possible.
If it was tested in a way different from regular unit tests, please
clarify how you tested, ideally via a reproducible test documented in
the PR description.
-->
Test locally. Used
`./kernel/tests/data/v2-checkpoints-parquet-with-sidecars.tar.zst`. The
output successfully print sidecar actions:
```
cargo run -p inspect-table -- v2-checkpoints-parquet-with-sidecars actions | head -17
Action 1:
Sidecar {
    path: "00000000000000000006.checkpoint.0000000001.0000000002.76931b15-ead3-480d-b86c-afe55a577fc3.parquet",
    size_in_bytes: 12461,
    modification_time: 1739329719752,
    tags: None,
}

Action 2:
Sidecar {
    path: "00000000000000000006.checkpoint.0000000002.0000000002.4367b29c-0e87-447f-8e81-9814cc01ad1f.parquet",
    size_in_bytes: 12109,
    modification_time: 1739329719746,
    tags: None,
}

```

* fix: force usage of ListedLogFiles::try_new() (delta-io#1562)

<!--
Thanks for sending a pull request!  Here are some tips for you:
1. If this is your first time, please read our contributor guidelines:
https://github.com/delta-incubator/delta-kernel-rs/blob/main/CONTRIBUTING.md
2. Run `cargo t --all-features --all-targets` to get started testing,
and run `cargo fmt`.
  3. Ensure you have added or run the appropriate tests for your PR.
4. If the PR is unfinished, add '[WIP]' in your PR title, e.g., '[WIP]
Your PR title ...'.
  5. Be sure to keep the PR description updated to reflect all changes.
-->

<!--
PR title formatting:
This project uses conventional commits:
https://www.conventionalcommits.org/

Each PR corresponds to a commit on the `main` branch, with the title of
the PR (typically) being
used for the commit message on main. In order to ensure proper
formatting in the CHANGELOG please
ensure your PR title adheres to the conventional commit specification.

Examples:
- new feature PR: "feat: new API for snapshot.update()"
- bugfix PR: "fix: correctly apply DV in read-table example"
-->

## What changes are proposed in this pull request?
<!--
Please clarify what changes you are proposing and why the changes are
needed.
The purpose of this section is to outline the changes, why they are
needed, and how this PR fixes the issue.
If the reason for the change is already explained clearly in an issue,
then it does not need to be restated here.
1. If you propose a new API or feature, clarify the use case for a new
API or feature.
  2. If you fix a bug, you can clarify why it is a bug.
-->
Change field of `ListedLogFiles` to private to force the usage of
`ListedLogFiles::try_new()`
Solves the issue delta-io#1143
<!--
Uncomment this section if there are any changes affecting public APIs:
### This PR affects the following public APIs

If there are breaking changes, please ensure the `breaking-changes`
label gets added by CI, and describe why the changes are needed.

Note that _new_ public APIs are not considered breaking.
-->


## How was this change tested?
Existing tests
<!--
Please make sure to add test cases that check the changes thoroughly
including negative and positive cases if possible.
If it was tested in a way different from regular unit tests, please
clarify how you tested, ideally via a reproducible test documented in
the PR description.
-->

* fix compile

* fix clippy

---------

Co-authored-by: OussamaSaoudi <45303303+OussamaSaoudi@users.noreply.github.com>
Co-authored-by: Nick Lanham <nicklan@users.noreply.github.com>
Co-authored-by: dengsh12 <62536982+dengsh12@users.noreply.github.com>
Fokko added a commit to Fokko/delta-kernel-rs that referenced this pull request Jan 9, 2026
* feat: Add CheckpointManifestReader to process sidecar files (delta-io#1500)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1500/files) to
review incremental changes.
-
[**stack/dlr_manifest**](delta-io#1500)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1500/files)]
-
[stack/dlr_driver](delta-io#1502)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1502/files/2f0a14caf7cd1070625525868e18da9c300b8a0f..4285e9c8ae504fe697b83f4719c0e0995e0e3bd1)]
-
[stack/dlr_serialization_helpers](delta-io#1543)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1543/files/4285e9c8ae504fe697b83f4719c0e0995e0e3bd1..60f13ec6ee1f7cc2b57006a09d4b0e82b59733b9)]
-
[stack/dlr_serde](delta-io#1503)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1503/files/60f13ec6ee1f7cc2b57006a09d4b0e82b59733b9..377ae3f2596116d00cba596268090d2f69118b2e)]
-
[stack/dlr_add_rm_dedup](delta-io#1537)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1537/files/377ae3f2596116d00cba596268090d2f69118b2e..06fdf84431d7ee9cf693149784b11e4afb242de1)]
-
[stack/dlr_immutable_add_rm_dedup](delta-io#1538)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1538/files/06fdf84431d7ee9cf693149784b11e4afb242de1..991cdd69f18eb680dbafae3c213093b036cb7a85)]
-
[stack/dlr_leaf](delta-io#1501)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1501/files/991cdd69f18eb680dbafae3c213093b036cb7a85..1f52bbc6512d7cb0a5e2a68954eb434be7313ef0)]
-
[stack/dlr_executor](delta-io#1539)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1539/files/1f52bbc6512d7cb0a5e2a68954eb434be7313ef0..9a4f638d613121fe5819e3fef6c03b3e5102ab73)]
- [stack/dlr_api](delta-io#1547)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1547/files/9a4f638d613121fe5819e3fef6c03b3e5102ab73..f385656ab1aa1f34caf77fa8518834d0ac0b998c)]
-
[stack/dlr_scan_state_serde](delta-io#1549)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1549/files/f385656ab1aa1f34caf77fa8518834d0ac0b998c..ac99eeec1f5d19fe76e8589f87cf53a7aa140e54)]

---------

This PR adds a CheckpointManifestReader that is responsible for reading
both manifest checkpoints and single-part checkpoints. For manifest
checkpoints, it collects all the sidecar files that are present and
returns them for further processing.

* feat: Distributed Log Replay Sequential Phase (delta-io#1502)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1502/files) to
review incremental changes.
-
[**stack/dlr_driver**](delta-io#1502)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1502/files)]
-
[stack/dlr_serialization_helpers](delta-io#1543)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1543/files/8f86b459613c0f018dd0e45473ba3e6e50d127af..0286f1d09006b099e73333c3d2d6a0873ede6cdd)]
-
[stack/dlr_serde](delta-io#1503)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1503/files/0286f1d09006b099e73333c3d2d6a0873ede6cdd..ee68c851e338a83584b004d919c40eca301e2ee3)]
-
[stack/dlr_add_rm_dedup](delta-io#1537)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1537/files/ee68c851e338a83584b004d919c40eca301e2ee3..436ce448e2dbf08ceb8f13350cb609ae3f554a7c)]
-
[stack/dlr_immutable_add_rm_dedup](delta-io#1538)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1538/files/436ce448e2dbf08ceb8f13350cb609ae3f554a7c..b2c2703bef78ef814c0579e82857cd67a2d1364b)]
-
[stack/dlr_leaf](delta-io#1501)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1501/files/b2c2703bef78ef814c0579e82857cd67a2d1364b..5f04e2059209c09a3ac8f5981d018347829bd8ab)]
-
[stack/dlr_executor](delta-io#1539)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1539/files/5f04e2059209c09a3ac8f5981d018347829bd8ab..7e2d26a6b063927e8b9a9fa62043ad30c705cc43)]
- [stack/dlr_api](delta-io#1547)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1547/files/7e2d26a6b063927e8b9a9fa62043ad30c705cc43..b608475ed1402d8640b89e5948d066e0867585b3)]
-
[stack/dlr_scan_state_serde](delta-io#1549)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1549/files/b608475ed1402d8640b89e5948d066e0867585b3..c35994fbf457ed95556acc7688456feb81923abf)]

---------
## What changes are proposed in this pull request?

This pull request introduces the SequentialPhase for distributed log
replay. This phase reads the commit and checkpoint files for a
logsegment and performs the log replay processor over the batches.

Upon completion, the `finish` method produces `AfterSequential` which
has two variants:
* `Done`: Indicates that the metadata phase is complete and there is no
more work to do.
* `Distributed`: Indicates that a distributed phase is required (see the
pr at stack/dlr_executor)

## How was this change tested?
Ensure that the sequential phase extracts the expected actions for:
* commits
* single-part checkpoints

Ensure that sequential phase produces `AfterSequential::Distributed` in
the presence of:
* sidecar files in a manifest checkpoint
* multi-part checkpoints

* feat/bugfix: Passing schema from C, plus example/tests in C (delta-io#1535)

## What changes are proposed in this pull request?
* Don't use a macro to generate primitive visitors. `cbindgen` runs
before macro expansion, so previously none of those visitors were
actually being generated
* Add code to `read_table` to allow specifying which columns to select,
plus all the associated code to pass that back to kernel
* Add c based tests to make sure it's working


## How was this change tested?
New tests when running `make test` in `read_table`

---------

Co-authored-by: OussamaSaoudi <45303303+OussamaSaoudi@users.noreply.github.com>

* feat!: expose mod time in scan metadata callbacks (delta-io#1565)

* feat: Support sidecar in inspect-table (delta-io#1566)

<!--
Thanks for sending a pull request!  Here are some tips for you:
1. If this is your first time, please read our contributor guidelines:
https://github.com/delta-incubator/delta-kernel-rs/blob/main/CONTRIBUTING.md
2. Run `cargo t --all-features --all-targets` to get started testing,
and run `cargo fmt`.
  3. Ensure you have added or run the appropriate tests for your PR.
4. If the PR is unfinished, add '[WIP]' in your PR title, e.g., '[WIP]
Your PR title ...'.
  5. Be sure to keep the PR description updated to reflect all changes.
-->

<!--
PR title formatting:
This project uses conventional commits:
https://www.conventionalcommits.org/

Each PR corresponds to a commit on the `main` branch, with the title of
the PR (typically) being
used for the commit message on main. In order to ensure proper
formatting in the CHANGELOG please
ensure your PR title adheres to the conventional commit specification.

Examples:
- new feature PR: "feat: new API for snapshot.update()"
- bugfix PR: "fix: correctly apply DV in read-table example"
-->

## What changes are proposed in this pull request?
<!--
Please clarify what changes you are proposing and why the changes are
needed.
The purpose of this section is to outline the changes, why they are
needed, and how this PR fixes the issue.
If the reason for the change is already explained clearly in an issue,
then it does not need to be restated here.
1. If you propose a new API or feature, clarify the use case for a new
API or feature.
  2. If you fix a bug, you can clarify why it is a bug.
-->
Support sidecar in inspect-table.
Solves the issue delta-io#695.
<!--
Uncomment this section if there are any changes affecting public APIs:
### This PR affects the following public APIs

If there are breaking changes, please ensure the `breaking-changes`
label gets added by CI, and describe why the changes are needed.

Note that _new_ public APIs are not considered breaking.
-->


## How was this change tested?
<!--
Please make sure to add test cases that check the changes thoroughly
including negative and positive cases if possible.
If it was tested in a way different from regular unit tests, please
clarify how you tested, ideally via a reproducible test documented in
the PR description.
-->
Test locally. Used
`./kernel/tests/data/v2-checkpoints-parquet-with-sidecars.tar.zst`. The
output successfully print sidecar actions:
```
cargo run -p inspect-table -- v2-checkpoints-parquet-with-sidecars actions | head -17
Action 1:
Sidecar {
    path: "00000000000000000006.checkpoint.0000000001.0000000002.76931b15-ead3-480d-b86c-afe55a577fc3.parquet",
    size_in_bytes: 12461,
    modification_time: 1739329719752,
    tags: None,
}

Action 2:
Sidecar {
    path: "00000000000000000006.checkpoint.0000000002.0000000002.4367b29c-0e87-447f-8e81-9814cc01ad1f.parquet",
    size_in_bytes: 12109,
    modification_time: 1739329719746,
    tags: None,
}

```

* fix: force usage of ListedLogFiles::try_new() (delta-io#1562)

<!--
Thanks for sending a pull request!  Here are some tips for you:
1. If this is your first time, please read our contributor guidelines:
https://github.com/delta-incubator/delta-kernel-rs/blob/main/CONTRIBUTING.md
2. Run `cargo t --all-features --all-targets` to get started testing,
and run `cargo fmt`.
  3. Ensure you have added or run the appropriate tests for your PR.
4. If the PR is unfinished, add '[WIP]' in your PR title, e.g., '[WIP]
Your PR title ...'.
  5. Be sure to keep the PR description updated to reflect all changes.
-->

<!--
PR title formatting:
This project uses conventional commits:
https://www.conventionalcommits.org/

Each PR corresponds to a commit on the `main` branch, with the title of
the PR (typically) being
used for the commit message on main. In order to ensure proper
formatting in the CHANGELOG please
ensure your PR title adheres to the conventional commit specification.

Examples:
- new feature PR: "feat: new API for snapshot.update()"
- bugfix PR: "fix: correctly apply DV in read-table example"
-->

## What changes are proposed in this pull request?
<!--
Please clarify what changes you are proposing and why the changes are
needed.
The purpose of this section is to outline the changes, why they are
needed, and how this PR fixes the issue.
If the reason for the change is already explained clearly in an issue,
then it does not need to be restated here.
1. If you propose a new API or feature, clarify the use case for a new
API or feature.
  2. If you fix a bug, you can clarify why it is a bug.
-->
Change field of `ListedLogFiles` to private to force the usage of
`ListedLogFiles::try_new()`
Solves the issue delta-io#1143
<!--
Uncomment this section if there are any changes affecting public APIs:
### This PR affects the following public APIs

If there are breaking changes, please ensure the `breaking-changes`
label gets added by CI, and describe why the changes are needed.

Note that _new_ public APIs are not considered breaking.
-->


## How was this change tested?
Existing tests
<!--
Please make sure to add test cases that check the changes thoroughly
including negative and positive cases if possible.
If it was tested in a way different from regular unit tests, please
clarify how you tested, ideally via a reproducible test documented in
the PR description.
-->

* fix: improve parse_json performance by removing line-by-line parsing (delta-io#1561)

Co-authored-by: emkornfield <emkornfield@gmail.com>
Co-authored-by: Nick Lanham <nick@databricks.com>

* sync changelog from `0.18.2` (delta-io#1570)

cherry-picks f105333

Co-authored-by: OussamaSaoudi <45303303+OussamaSaoudi@users.noreply.github.com>
Co-authored-by: Drake Lin <drakelin18@gmail.com>

* feature: short-circuit coalesce evaluation when array has no nulls (delta-io#1568)

## What changes are proposed in this pull request?
<!--
Please clarify what changes you are proposing and why the changes are
needed.
The purpose of this section is to outline the changes, why they are
needed, and how this PR fixes the issue.
If the reason for the change is already explained clearly in an issue,
then it does not need to be restated here.
1. If you propose a new API or feature, clarify the use case for a new
API or feature.
  2. If you fix a bug, you can clarify why it is a bug.
-->

Optimizes the coalesce expression evaluation in the default Arrow engine
to short-circuit when an evaluated array has no null values. Previously,
all expressions were eagerly evaluated before coalescing.
- After evaluating each expression, check if `null_count() == 0`
- If no nulls exist, validate the result type and return immediately
without evaluating remaining expressions
- `null_count()` on Arrow arrays is O(1) (cached value), so the check is
essentially free. This optimization avoids evaluating potentially
expensive expressions when earlier expressions already provide complete
(non-null) results.

Usecase:
- For ParsedStats, we will see coalesces in both read/write
    - In read: we want to coalesce(parsed_stats, ParseJson(json_stats))
    - In write:
        - ParsedStats: coalesce(parsed_stats, ParseJson(json_stats))
        - JsonStats: coalesce(json_stats, ToJson(ParsedStats))
In each of these cases, all of one column will either be Null or
non-Null so this optimization actually completely removes the need to
evaluate the expensive parseJson/ToJson if unnecessary.

Future improvements: 
- Track each row such that it short-circuits as soon as all rows are
filled, even if no single array was 100% non-null
- This can be implemented with FilteredEngineData, but that lacks
support across the engine
<!--
Uncomment this section if there are any changes affecting public APIs:
### This PR affects the following public APIs

If there are breaking changes, please ensure the `breaking-changes`
label gets added by CI, and describe why the changes are needed.

Note that _new_ public APIs are not considered breaking.
-->


## How was this change tested?
<!--
Please make sure to add test cases that check the changes thoroughly
including negative and positive cases if possible.
If it was tested in a way different from regular unit tests, please
clarify how you tested, ideally via a reproducible test documented in
the PR description.
-->

new and existing unit tests

* release 0.19.0 (delta-io#1571)

release 0.19.0: [link to rendered
changelog](https://github.com/zachschuermann/delta-kernel-rs/blob/a23efae27cf8bd7859a24ad66f57dcb0f6fac851/CHANGELOG.md)

---------

Co-authored-by: OussamaSaoudi <45303303+OussamaSaoudi@users.noreply.github.com>
Co-authored-by: Nick Lanham <nicklan@users.noreply.github.com>
Co-authored-by: dengsh12 <62536982+dengsh12@users.noreply.github.com>
Co-authored-by: R. Tyler Croy <rtyler@brokenco.de>
Co-authored-by: emkornfield <emkornfield@gmail.com>
Co-authored-by: Nick Lanham <nick@databricks.com>
Co-authored-by: Zach Schuermann <zachary.zvs@gmail.com>
Co-authored-by: Drake Lin <drakelin18@gmail.com>
@OussamaSaoudi
OussamaSaoudi force-pushed the stack/dlr_add_rm_dedup branch 4 times, most recently from 10a3acd to ab6f32c Compare January 15, 2026 23:08
OussamaSaoudi added a commit that referenced this pull request Jan 16, 2026
…pressions (#1543)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1543/files) to
review incremental changes.
-
[**stack/dlr_serialization_helpers**](#1543)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1543/files)]
-
[stack/dlr_serde](#1503)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1503/files/24f9ac49c8fd3d846fbfd177e0e79f6205586abb..5a19246777bb92a49766105ba7cd6c3f1efd56a6)]
-
[stack/dlr_add_rm_dedup](#1537)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1537/files/5a19246777bb92a49766105ba7cd6c3f1efd56a6..ab6f32ca7ede0b27a3c699dc9601d61ad30ddb44)]
-
[stack/dlr_immutable_add_rm_dedup](#1538)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1538/files/ab6f32ca7ede0b27a3c699dc9601d61ad30ddb44..db1eac45ce60dc5c126120cfd25e6604c475ae31)]
-
[stack/dlr_executor](#1539)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1539/files/db1eac45ce60dc5c126120cfd25e6604c475ae31..30fe3f9201723467eeb166dc2f9a632550291daf)]
- [stack/dlr_api](#1547)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1547/files/30fe3f9201723467eeb166dc2f9a632550291daf..26d21587e52964a519708222523ba75ffe21fe7d)]
-
[stack/dlr_scan_state_serde](#1549)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1549/files/26d21587e52964a519708222523ba75ffe21fe7d..9035f876cbb4c2dc9f3d9fedf1d3f772238f66f9)]

---------
<!--
Thanks for sending a pull request!  Here are some tips for you:
1. If this is your first time, please read our contributor guidelines:
https://github.com/delta-incubator/delta-kernel-rs/blob/main/CONTRIBUTING.md
2. Run `cargo t --all-features --all-targets` to get started testing,
and run `cargo fmt`.
  3. Ensure you have added or run the appropriate tests for your PR.
4. If the PR is unfinished, add '[WIP]' in your PR title, e.g., '[WIP]
Your PR title ...'.
  5. Be sure to keep the PR description updated to reflect all changes.
-->
This PR adds the ability to serialize/deserialize expressions and
predicates using serde. This is used in when transferring state across
network boundaries such as in parallel log replay.

<!--
PR title formatting:
This project uses conventional commits:
https://www.conventionalcommits.org/

Each PR corresponds to a commit on the `main` branch, with the title of
the PR (typically) being
used for the commit message on main. In order to ensure proper
formatting in the CHANGELOG please
ensure your PR title adheres to the conventional commit specification.

Examples:
- new feature PR: "feat: new API for snapshot.update()"
- bugfix PR: "fix: correctly apply DV in read-table example"
-->

## What changes are proposed in this pull request?
This PR adds serialization/deserialization to the expressions and
predicates. Opaque expressions will fail since kernel cannot know how to
serialize/deserialize them.


## How was this change tested?
Ensure that serde fails in the presence of opaque expressions.
@OussamaSaoudi
OussamaSaoudi force-pushed the stack/dlr_add_rm_dedup branch from ab6f32c to 0789ba0 Compare January 16, 2026 17:38
OussamaSaoudi and others added 2 commits January 16, 2026 11:03
Co-authored-by: Nick Lanham <nicklan@users.noreply.github.com>
@OussamaSaoudi
OussamaSaoudi force-pushed the stack/dlr_add_rm_dedup branch from bc61e90 to cb9f977 Compare January 16, 2026 19:13
@OussamaSaoudi
OussamaSaoudi merged commit 83bb25a into delta-io:main Jan 16, 2026
21 of 22 checks passed
Fokko added a commit to Fokko/delta-kernel-rs that referenced this pull request Jan 30, 2026
* feat: Add CheckpointManifestReader to process sidecar files (delta-io#1500)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1500/files) to
review incremental changes.
-
[**stack/dlr_manifest**](delta-io#1500)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1500/files)]
-
[stack/dlr_driver](delta-io#1502)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1502/files/2f0a14caf7cd1070625525868e18da9c300b8a0f..4285e9c8ae504fe697b83f4719c0e0995e0e3bd1)]
-
[stack/dlr_serialization_helpers](delta-io#1543)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1543/files/4285e9c8ae504fe697b83f4719c0e0995e0e3bd1..60f13ec6ee1f7cc2b57006a09d4b0e82b59733b9)]
-
[stack/dlr_serde](delta-io#1503)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1503/files/60f13ec6ee1f7cc2b57006a09d4b0e82b59733b9..377ae3f2596116d00cba596268090d2f69118b2e)]
-
[stack/dlr_add_rm_dedup](delta-io#1537)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1537/files/377ae3f2596116d00cba596268090d2f69118b2e..06fdf84431d7ee9cf693149784b11e4afb242de1)]
-
[stack/dlr_immutable_add_rm_dedup](delta-io#1538)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1538/files/06fdf84431d7ee9cf693149784b11e4afb242de1..991cdd69f18eb680dbafae3c213093b036cb7a85)]
-
[stack/dlr_leaf](delta-io#1501)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1501/files/991cdd69f18eb680dbafae3c213093b036cb7a85..1f52bbc6512d7cb0a5e2a68954eb434be7313ef0)]
-
[stack/dlr_executor](delta-io#1539)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1539/files/1f52bbc6512d7cb0a5e2a68954eb434be7313ef0..9a4f638d613121fe5819e3fef6c03b3e5102ab73)]
- [stack/dlr_api](delta-io#1547)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1547/files/9a4f638d613121fe5819e3fef6c03b3e5102ab73..f385656ab1aa1f34caf77fa8518834d0ac0b998c)]
-
[stack/dlr_scan_state_serde](delta-io#1549)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1549/files/f385656ab1aa1f34caf77fa8518834d0ac0b998c..ac99eeec1f5d19fe76e8589f87cf53a7aa140e54)]

---------

This PR adds a CheckpointManifestReader that is responsible for reading
both manifest checkpoints and single-part checkpoints. For manifest
checkpoints, it collects all the sidecar files that are present and
returns them for further processing.

* feat: Distributed Log Replay Sequential Phase (delta-io#1502)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1502/files) to
review incremental changes.
-
[**stack/dlr_driver**](delta-io#1502)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1502/files)]
-
[stack/dlr_serialization_helpers](delta-io#1543)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1543/files/8f86b459613c0f018dd0e45473ba3e6e50d127af..0286f1d09006b099e73333c3d2d6a0873ede6cdd)]
-
[stack/dlr_serde](delta-io#1503)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1503/files/0286f1d09006b099e73333c3d2d6a0873ede6cdd..ee68c851e338a83584b004d919c40eca301e2ee3)]
-
[stack/dlr_add_rm_dedup](delta-io#1537)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1537/files/ee68c851e338a83584b004d919c40eca301e2ee3..436ce448e2dbf08ceb8f13350cb609ae3f554a7c)]
-
[stack/dlr_immutable_add_rm_dedup](delta-io#1538)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1538/files/436ce448e2dbf08ceb8f13350cb609ae3f554a7c..b2c2703bef78ef814c0579e82857cd67a2d1364b)]
-
[stack/dlr_leaf](delta-io#1501)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1501/files/b2c2703bef78ef814c0579e82857cd67a2d1364b..5f04e2059209c09a3ac8f5981d018347829bd8ab)]
-
[stack/dlr_executor](delta-io#1539)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1539/files/5f04e2059209c09a3ac8f5981d018347829bd8ab..7e2d26a6b063927e8b9a9fa62043ad30c705cc43)]
- [stack/dlr_api](delta-io#1547)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1547/files/7e2d26a6b063927e8b9a9fa62043ad30c705cc43..b608475ed1402d8640b89e5948d066e0867585b3)]
-
[stack/dlr_scan_state_serde](delta-io#1549)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1549/files/b608475ed1402d8640b89e5948d066e0867585b3..c35994fbf457ed95556acc7688456feb81923abf)]

---------
## What changes are proposed in this pull request?

This pull request introduces the SequentialPhase for distributed log
replay. This phase reads the commit and checkpoint files for a
logsegment and performs the log replay processor over the batches.

Upon completion, the `finish` method produces `AfterSequential` which
has two variants:
* `Done`: Indicates that the metadata phase is complete and there is no
more work to do.
* `Distributed`: Indicates that a distributed phase is required (see the
pr at stack/dlr_executor)

## How was this change tested?
Ensure that the sequential phase extracts the expected actions for:
* commits
* single-part checkpoints

Ensure that sequential phase produces `AfterSequential::Distributed` in
the presence of:
* sidecar files in a manifest checkpoint
* multi-part checkpoints

* feat/bugfix: Passing schema from C, plus example/tests in C (delta-io#1535)

## What changes are proposed in this pull request?
* Don't use a macro to generate primitive visitors. `cbindgen` runs
before macro expansion, so previously none of those visitors were
actually being generated
* Add code to `read_table` to allow specifying which columns to select,
plus all the associated code to pass that back to kernel
* Add c based tests to make sure it's working


## How was this change tested?
New tests when running `make test` in `read_table`

---------

Co-authored-by: OussamaSaoudi <45303303+OussamaSaoudi@users.noreply.github.com>

* feat!: expose mod time in scan metadata callbacks (delta-io#1565)

* feat: Support sidecar in inspect-table (delta-io#1566)

<!--
Thanks for sending a pull request!  Here are some tips for you:
1. If this is your first time, please read our contributor guidelines:
https://github.com/delta-incubator/delta-kernel-rs/blob/main/CONTRIBUTING.md
2. Run `cargo t --all-features --all-targets` to get started testing,
and run `cargo fmt`.
  3. Ensure you have added or run the appropriate tests for your PR.
4. If the PR is unfinished, add '[WIP]' in your PR title, e.g., '[WIP]
Your PR title ...'.
  5. Be sure to keep the PR description updated to reflect all changes.
-->

<!--
PR title formatting:
This project uses conventional commits:
https://www.conventionalcommits.org/

Each PR corresponds to a commit on the `main` branch, with the title of
the PR (typically) being
used for the commit message on main. In order to ensure proper
formatting in the CHANGELOG please
ensure your PR title adheres to the conventional commit specification.

Examples:
- new feature PR: "feat: new API for snapshot.update()"
- bugfix PR: "fix: correctly apply DV in read-table example"
-->

## What changes are proposed in this pull request?
<!--
Please clarify what changes you are proposing and why the changes are
needed.
The purpose of this section is to outline the changes, why they are
needed, and how this PR fixes the issue.
If the reason for the change is already explained clearly in an issue,
then it does not need to be restated here.
1. If you propose a new API or feature, clarify the use case for a new
API or feature.
  2. If you fix a bug, you can clarify why it is a bug.
-->
Support sidecar in inspect-table.
Solves the issue delta-io#695.
<!--
Uncomment this section if there are any changes affecting public APIs:
### This PR affects the following public APIs

If there are breaking changes, please ensure the `breaking-changes`
label gets added by CI, and describe why the changes are needed.

Note that _new_ public APIs are not considered breaking.
-->


## How was this change tested?
<!--
Please make sure to add test cases that check the changes thoroughly
including negative and positive cases if possible.
If it was tested in a way different from regular unit tests, please
clarify how you tested, ideally via a reproducible test documented in
the PR description.
-->
Test locally. Used
`./kernel/tests/data/v2-checkpoints-parquet-with-sidecars.tar.zst`. The
output successfully print sidecar actions:
```
cargo run -p inspect-table -- v2-checkpoints-parquet-with-sidecars actions | head -17
Action 1:
Sidecar {
    path: "00000000000000000006.checkpoint.0000000001.0000000002.76931b15-ead3-480d-b86c-afe55a577fc3.parquet",
    size_in_bytes: 12461,
    modification_time: 1739329719752,
    tags: None,
}

Action 2:
Sidecar {
    path: "00000000000000000006.checkpoint.0000000002.0000000002.4367b29c-0e87-447f-8e81-9814cc01ad1f.parquet",
    size_in_bytes: 12109,
    modification_time: 1739329719746,
    tags: None,
}

```

* fix: force usage of ListedLogFiles::try_new() (delta-io#1562)

<!--
Thanks for sending a pull request!  Here are some tips for you:
1. If this is your first time, please read our contributor guidelines:
https://github.com/delta-incubator/delta-kernel-rs/blob/main/CONTRIBUTING.md
2. Run `cargo t --all-features --all-targets` to get started testing,
and run `cargo fmt`.
  3. Ensure you have added or run the appropriate tests for your PR.
4. If the PR is unfinished, add '[WIP]' in your PR title, e.g., '[WIP]
Your PR title ...'.
  5. Be sure to keep the PR description updated to reflect all changes.
-->

<!--
PR title formatting:
This project uses conventional commits:
https://www.conventionalcommits.org/

Each PR corresponds to a commit on the `main` branch, with the title of
the PR (typically) being
used for the commit message on main. In order to ensure proper
formatting in the CHANGELOG please
ensure your PR title adheres to the conventional commit specification.

Examples:
- new feature PR: "feat: new API for snapshot.update()"
- bugfix PR: "fix: correctly apply DV in read-table example"
-->

## What changes are proposed in this pull request?
<!--
Please clarify what changes you are proposing and why the changes are
needed.
The purpose of this section is to outline the changes, why they are
needed, and how this PR fixes the issue.
If the reason for the change is already explained clearly in an issue,
then it does not need to be restated here.
1. If you propose a new API or feature, clarify the use case for a new
API or feature.
  2. If you fix a bug, you can clarify why it is a bug.
-->
Change field of `ListedLogFiles` to private to force the usage of
`ListedLogFiles::try_new()`
Solves the issue delta-io#1143
<!--
Uncomment this section if there are any changes affecting public APIs:
### This PR affects the following public APIs

If there are breaking changes, please ensure the `breaking-changes`
label gets added by CI, and describe why the changes are needed.

Note that _new_ public APIs are not considered breaking.
-->


## How was this change tested?
Existing tests
<!--
Please make sure to add test cases that check the changes thoroughly
including negative and positive cases if possible.
If it was tested in a way different from regular unit tests, please
clarify how you tested, ideally via a reproducible test documented in
the PR description.
-->

* fix: improve parse_json performance by removing line-by-line parsing (delta-io#1561)

Co-authored-by: emkornfield <emkornfield@gmail.com>
Co-authored-by: Nick Lanham <nick@databricks.com>

* sync changelog from `0.18.2` (delta-io#1570)

cherry-picks f105333

Co-authored-by: OussamaSaoudi <45303303+OussamaSaoudi@users.noreply.github.com>
Co-authored-by: Drake Lin <drakelin18@gmail.com>

* feature: short-circuit coalesce evaluation when array has no nulls (delta-io#1568)

## What changes are proposed in this pull request?
<!--
Please clarify what changes you are proposing and why the changes are
needed.
The purpose of this section is to outline the changes, why they are
needed, and how this PR fixes the issue.
If the reason for the change is already explained clearly in an issue,
then it does not need to be restated here.
1. If you propose a new API or feature, clarify the use case for a new
API or feature.
  2. If you fix a bug, you can clarify why it is a bug.
-->

Optimizes the coalesce expression evaluation in the default Arrow engine
to short-circuit when an evaluated array has no null values. Previously,
all expressions were eagerly evaluated before coalescing.
- After evaluating each expression, check if `null_count() == 0`
- If no nulls exist, validate the result type and return immediately
without evaluating remaining expressions
- `null_count()` on Arrow arrays is O(1) (cached value), so the check is
essentially free. This optimization avoids evaluating potentially
expensive expressions when earlier expressions already provide complete
(non-null) results.

Usecase:
- For ParsedStats, we will see coalesces in both read/write
    - In read: we want to coalesce(parsed_stats, ParseJson(json_stats))
    - In write:
        - ParsedStats: coalesce(parsed_stats, ParseJson(json_stats))
        - JsonStats: coalesce(json_stats, ToJson(ParsedStats))
In each of these cases, all of one column will either be Null or
non-Null so this optimization actually completely removes the need to
evaluate the expensive parseJson/ToJson if unnecessary.

Future improvements: 
- Track each row such that it short-circuits as soon as all rows are
filled, even if no single array was 100% non-null
- This can be implemented with FilteredEngineData, but that lacks
support across the engine
<!--
Uncomment this section if there are any changes affecting public APIs:
### This PR affects the following public APIs

If there are breaking changes, please ensure the `breaking-changes`
label gets added by CI, and describe why the changes are needed.

Note that _new_ public APIs are not considered breaking.
-->


## How was this change tested?
<!--
Please make sure to add test cases that check the changes thoroughly
including negative and positive cases if possible.
If it was tested in a way different from regular unit tests, please
clarify how you tested, ideally via a reproducible test documented in
the PR description.
-->

new and existing unit tests

* release 0.19.0 (delta-io#1571)

release 0.19.0: [link to rendered
changelog](https://github.com/zachschuermann/delta-kernel-rs/blob/a23efae27cf8bd7859a24ad66f57dcb0f6fac851/CHANGELOG.md)

* [Test Only] Minor refactor to log_segment tests (delta-io#1581)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1581/files) to
review incremental changes.
-
[**stack/log_segment_tests_refactor**](delta-io#1581)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1581/files)]

---------
This PR refactors the `create_segment_for` test helper method inside of
`log_segment/tests.rs`.

Instead of taking in N params, we take in a struct (that contains those
N params).

This will make adding new params in the future easier and cleaner (e.g.
staged catalog commits)

* Refactor `ListedLogFiles::try_new` to be more extensible and with default values by using builder pattern (delta-io#1585)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1585/files) to
review incremental changes.
-
[**stack/listed_log_files_refactor**](delta-io#1585)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1585/files)]

---------
This PR refactors `ListedLogFiles::try_new` to instead be
`ListedLogFilesBuilder::build()`.

This allows using default values in the `ListedLogFilesBuilder`, which
will make creating `ListedLogFiles` easier in the future (e.g. when we
add `max_known_published_commit_version`).

* Fix: add type validation for `evaluate_expression` (delta-io#1575)

<!--
Thanks for sending a pull request!  Here are some tips for you:
1. If this is your first time, please read our contributor guidelines:
https://github.com/delta-incubator/delta-kernel-rs/blob/main/CONTRIBUTING.md
2. Run `cargo t --all-features --all-targets` to get started testing,
and run `cargo fmt`.
  3. Ensure you have added or run the appropriate tests for your PR.
4. If the PR is unfinished, add '[WIP]' in your PR title, e.g., '[WIP]
Your PR title ...'.
  5. Be sure to keep the PR description updated to reflect all changes.
-->

<!--
PR title formatting:
This project uses conventional commits:
https://www.conventionalcommits.org/

Each PR corresponds to a commit on the `main` branch, with the title of
the PR (typically) being
used for the commit message on main. In order to ensure proper
formatting in the CHANGELOG please
ensure your PR title adheres to the conventional commit specification.

Examples:
- new feature PR: "feat: new API for snapshot.update()"
- bugfix PR: "fix: correctly apply DV in read-table example"
-->

## What changes are proposed in this pull request?
<!--
Please clarify what changes you are proposing and why the changes are
needed.
The purpose of this section is to outline the changes, why they are
needed, and how this PR fixes the issue.
If the reason for the change is already explained clearly in an issue,
then it does not need to be restated here.
1. If you propose a new API or feature, clarify the use case for a new
API or feature.
  2. If you fix a bug, you can clarify why it is a bug.
-->
Add missing `result_type` validation in `evaluate_expression` for
`Literal`, `Column`, and `Binary` branches.

This resolves delta-io#1572
<!--
Uncomment this section if there are any changes affecting public APIs:
### This PR affects the following public APIs

If there are breaking changes, please ensure the `breaking-changes`
label gets added by CI, and describe why the changes are needed.

Note that _new_ public APIs are not considered breaking.
-->


## How was this change tested?
<!--
Please make sure to add test cases that check the changes thoroughly
including negative and positive cases if possible.
If it was tested in a way different from regular unit tests, please
clarify how you tested, ideally via a reproducible test documented in
the PR description.
-->
new and existing unit tests

* refactor: move doctest into mods (delta-io#1574)

<!--
Thanks for sending a pull request!  Here are some tips for you:
1. If this is your first time, please read our contributor guidelines:
https://github.com/delta-incubator/delta-kernel-rs/blob/main/CONTRIBUTING.md
2. Run `cargo t --all-features --all-targets` to get started testing,
and run `cargo fmt`.
  3. Ensure you have added or run the appropriate tests for your PR.
4. If the PR is unfinished, add '[WIP]' in your PR title, e.g., '[WIP]
Your PR title ...'.
  5. Be sure to keep the PR description updated to reflect all changes.
-->

<!--
PR title formatting:
This project uses conventional commits:
https://www.conventionalcommits.org/

Each PR corresponds to a commit on the `main` branch, with the title of
the PR (typically) being
used for the commit message on main. In order to ensure proper
formatting in the CHANGELOG please
ensure your PR title adheres to the conventional commit specification.

Examples:
- new feature PR: "feat: new API for snapshot.update()"
- bugfix PR: "fix: correctly apply DV in read-table example"
-->

## What changes are proposed in this pull request?
<!--
Please clarify what changes you are proposing and why the changes are
needed.
The purpose of this section is to outline the changes, why they are
needed, and how this PR fixes the issue.
If the reason for the change is already explained clearly in an issue,
then it does not need to be restated here.
1. If you propose a new API or feature, clarify the use case for a new
API or feature.
  2. If you fix a bug, you can clarify why it is a bug.
-->
Currently all doctests live inline in `kernel/src/lib.rs`. This PR moves
them to `kernel/src/doctests/` with separate files per macro, making it
easier to add new macro tests without enlarging `lib.rs`.

Related: delta-io#991
<!--
Uncomment this section if there are any changes affecting public APIs:
### This PR affects the following public APIs

If there are breaking changes, please ensure the `breaking-changes`
label gets added by CI, and describe why the changes are needed.

Note that _new_ public APIs are not considered breaking.
-->


## How was this change tested?
<!--
Please make sure to add test cases that check the changes thoroughly
including negative and positive cases if possible.
If it was tested in a way different from regular unit tests, please
clarify how you tested, ideally via a reproducible test documented in
the PR description.
-->
Ran existing tests

* feat: add checkpoint schema discovery for stats_parsed detection (delta-io#1550)

## What changes are proposed in this pull request?
<!--
Please clarify what changes you are proposing and why the changes are
needed.
The purpose of this section is to outline the changes, why they are
needed, and how this PR fixes the issue.
If the reason for the change is already explained clearly in an issue,
then it does not need to be restated here.
1. If you propose a new API or feature, clarify the use case for a new
API or feature.
  2. If you fix a bug, you can clarify why it is a bug.
-->

This PR adds infrastructure for discovering checkpoint schemas and
detecting whether `stats_parsed` is available for data skipping
optimization.

  1. Store checkpoint schema in LogSegment (`log_segment.rs`)
  2. Add stats_parsed detection (`log_segment.rs`)
- During log replay / sidecar visiting, we figure out the schema for the
file action files (whether the sidecar parquet files for V2 checkpoints
or the V1 checkpoint parquet.

## How was this change tested?
<!--
Please make sure to add test cases that check the changes thoroughly
including negative and positive cases if possible.
If it was tested in a way different from regular unit tests, please
clarify how you tested, ideally via a reproducible test documented in
the PR description.
-->

  - Existing log segment tests updated

* refactor: deny panics in ffi crate (delta-io#1576)

<!--
Thanks for sending a pull request!  Here are some tips for you:
1. If this is your first time, please read our contributor guidelines:
https://github.com/delta-incubator/delta-kernel-rs/blob/main/CONTRIBUTING.md
2. Run `cargo t --all-features --all-targets` to get started testing,
and run `cargo fmt`.
  3. Ensure you have added or run the appropriate tests for your PR.
4. If the PR is unfinished, add '[WIP]' in your PR title, e.g., '[WIP]
Your PR title ...'.
  5. Be sure to keep the PR description updated to reflect all changes.
-->

<!--
PR title formatting:
This project uses conventional commits:
https://www.conventionalcommits.org/

Each PR corresponds to a commit on the `main` branch, with the title of
the PR (typically) being
used for the commit message on main. In order to ensure proper
formatting in the CHANGELOG please
ensure your PR title adheres to the conventional commit specification.

Examples:
- new feature PR: "feat: new API for snapshot.update()"
- bugfix PR: "fix: correctly apply DV in read-table example"
-->

## What changes are proposed in this pull request?
<!--
Please clarify what changes you are proposing and why the changes are
needed.
The purpose of this section is to outline the changes, why they are
needed, and how this PR fixes the issue.
If the reason for the change is already explained clearly in an issue,
then it does not need to be restated here.
1. If you propose a new API or feature, clarify the use case for a new
API or feature.
  2. If you fix a bug, you can clarify why it is a bug.
-->
1. Add clippy lints to deny panics in the FFI crate (non-test code)
2. Fix violations by returning errors instead of panicking
3. Allow `expect` in theoretically unreachable paths
<!--
Uncomment this section if there are any changes affecting public APIs:
### This PR affects the following public APIs

If there are breaking changes, please ensure the `breaking-changes`
label gets added by CI, and describe why the changes are needed.

Note that _new_ public APIs are not considered breaking.
-->


## How was this change tested?
<!--
Please make sure to add test cases that check the changes thoroughly
including negative and positive cases if possible.
If it was tested in a way different from regular unit tests, please
clarify how you tested, ideally via a reproducible test documented in
the PR description.
-->
Existing tests in `ffi/examples/read-table`

* Remove comments and text from `pull_request_template.md` (delta-io#1589)

## What changes are proposed in this pull request?

Move text from `pull_request_template.md` to `CONTRIBUTING.md`.

Make PR template file name all-caps.

## How was this change tested?

N/A.

* feat!: add deletion vector APIs to transaction (delta-io#1430)

Adds the ability to update deletion vectors on delta tables.

Co-authored-by: Drake Lin <drakelin18@gmail.com>
Co-authored-by: Nick Lanham <nicklan@users.noreply.github.com>

* feat: Add doctests for `IntoEngineData` derive macro (delta-io#1580)

<!--
PR title formatting:
This project uses conventional commits:
https://www.conventionalcommits.org/

Each PR corresponds to a commit on the `main` branch, with the title of
the PR (typically) being
used for the commit message on main. In order to ensure proper
formatting in the CHANGELOG please
ensure your PR title adheres to the conventional commit specification.

Examples:
- new feature PR: "feat: new API for snapshot.update()"
- bugfix PR: "fix: correctly apply DV in read-table example"
-->

## What changes are proposed in this pull request?
<!--
Please clarify what changes you are proposing and why the changes are
needed.
The purpose of this section is to outline the changes, why they are
needed, and how this PR fixes the issue.
If the reason for the change is already explained clearly in an issue,
then it does not need to be restated here.
1. If you propose a new API or feature, clarify the use case for a new
API or feature.
  2. If you fix a bug, you can clarify why it is a bug.
-->

This PR:
- Changes the `IntoEngineData` macro to use `delta_kernel::` paths
- Adds doctests for the derive macro

Related: delta-io#991
<!--
Uncomment this section if there are any changes affecting public APIs:
### This PR affects the following public APIs

If there are breaking changes, please ensure the `breaking-changes`
label gets added by CI, and describe why the changes are needed.

Note that _new_ public APIs are not considered breaking.
-->


## How was this change tested?
<!--
Please make sure to add test cases that check the changes thoroughly
including negative and positive cases if possible.
If it was tested in a way different from regular unit tests, please
clarify how you tested, ideally via a reproducible test documented in
the PR description.
-->
Added tests.

* feat: Create `DefaultEngineBuilder` to build `DefaultEngine` (delta-io#1582)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/1582/files) to
review incremental changes.
-
[**stack/engine-builder**](delta-io#1582)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1582/files)]
-
[stack/remove-constructor](delta-io#1583)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/1583/files/29e082a58b9382149285f30351d53468d6ed49dc..0026634ac5bf5f546d45a4d25dd0f46cb8d39d1b)]

---------
## What changes are proposed in this pull request?
<!--
Please clarify what changes you are proposing and why the changes are
needed.
The purpose of this section is to outline the changes, why they are
needed, and how this PR fixes the issue.
If the reason for the change is already explained clearly in an issue,
then it does not need to be restated here.
1. If you propose a new API or feature, clarify the use case for a new
API or feature.
  2. If you fix a bug, you can clarify why it is a bug.
-->

Add `DefaultEngineBuilder` for more flexible engine construction and
align with the builder pattern used elsewhere in this repo.

## Detail changes

- Add generic `DefaultEngineBuilder<E>` with builder pattern
- Support `with_task_executor()` to use custom executors
- Support `with_metrics_reporter()` for metrics collection
- Add `DefaultEngine::builder()` convenience method

<!--
Uncomment this section if there are any changes affecting public APIs:
### This PR affects the following public APIs

If there are breaking changes, please ensure the `breaking-changes`
label gets added by CI, and describe why the changes are needed.

Note that _new_ public APIs are not considered breaking.
-->


## How was this change tested?
<!--
Please make sure to add test cases that check the changes thoroughly
including negative and positive cases if possible.
If it was tested in a way different from regular unit tests, please
clarify how you tested, ideally via a reproducible test documented in
the PR description.
-->
Added tests.

* refactor: extract shared HTTP utilities to http.rs (delta-io#1590)

## What changes are proposed in this pull request?

Extract `build_http_client`, `execute_with_retry`, and `handle_response`
from `UCClient` into a shared `http.rs` module. This enables reuse by
other client implementations (and is used in the child stacked PR delta-io#1590)

## How was this change tested?

`cargo build -p uc-client -p uc-catalog`

* Fix conflicts

* Fix dangling conflicts

* Fix the tests

---------

Co-authored-by: OussamaSaoudi <45303303+OussamaSaoudi@users.noreply.github.com>
Co-authored-by: Nick Lanham <nicklan@users.noreply.github.com>
Co-authored-by: dengsh12 <62536982+dengsh12@users.noreply.github.com>
Co-authored-by: R. Tyler Croy <rtyler@brokenco.de>
Co-authored-by: emkornfield <emkornfield@gmail.com>
Co-authored-by: Nick Lanham <nick@databricks.com>
Co-authored-by: Zach Schuermann <zachary.zvs@gmail.com>
Co-authored-by: Drake Lin <drakelin18@gmail.com>
Co-authored-by: Scott Sandre <scott.sandre@databricks.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking-change Public API change that could cause downstream compilation failures. Requires a major version bump.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants