Skip to content

Remastered - #9

Open
damn-am-star wants to merge 635 commits into
DrakeLin:mainfrom
damn-am-star:remastered
Open

damn-am-star wants to merge 635 commits into
DrakeLin:mainfrom
damn-am-star:remastered

Conversation

@damn-am-star

Copy link
Copy Markdown

What changes are proposed in this pull request?

How was this change tested?

scottsand-db and others added 30 commits July 8, 2026 00:01
## What changes are proposed in this pull request?

Previously, `snap.write_checksum` only worked if:
- there is a CRC on disk at N, you write `N+1.json`, and then we can
write `N+1.crc`
- there is a CRC on disk at N - 5, you load a Snapshot with incremental
replay turned on, then we have an in-memory CRC at N. Now we can write a
CRC at N, or at N+1 if we perform a commit, too

Now, this PR enables writing CRC for the cases of:
- checkpoint-rooted snapshot [10.checkpoint, 11.json, 12.json]
- checkpoint-versioned snapshot [10.checkpoint]
- v0 rooted snasphot [0.json, 1.json, 2.json]
- stale CRC with incremental replay disabled [10.checkpoint, 11.json,
12.json, 12.crc, 13.json, 14.json]

## How was this change tested?

New UTs for these specific cases + error cases. Also added
write-checksum to the cross-product suite (2800+ tests) which already
covers lots of stale CRC, only checkpoint, no checkpoint, etc cases.
## What changes are proposed in this pull request?

Adds a user-guide page documenting the incremental scan API
(`Snapshot::incremental_scan_builder`), which advances a cached file
listing across a version range without a full log replay. The API exists
but had no coverage in the mdBook guide.

The page covers the `(base_version, target_version]` range model, the
`Option` return and full-scan fallback, `(path, dv_unique_id)` file
keying, advancing a cached listing with the `removes` and
`duplicate_adds` masks, sticky errors, the vacuum race, the
catalog-managed log-tail requirement, and current limitations (no
predicate or column pushdown; in-range metadata changes not surfaced,
tracked in delta-io#2552). It's added to the "Reading Tables" section of
`SUMMARY.md`, after Time Travel and before Change Data Feed.

## How was this change tested?

`make test` compiles every Rust example on the page, and `mdbook build`
renders it and checks links.
…o#2886)

## What changes are proposed in this pull request?
**Issue:**

Reading a Delta table fails at snapshot load when the table's column
mapping mode is
`none` but its schema still carries `delta.columnMapping.physicalName` /
`delta.columnMapping.id` field annotations:

```
Schema error: Column mapping is not enabled but field '<x>' is annotated with
delta.columnMapping.physicalName
```

Such tables arise when column mapping was enabled and later disabled -
the mode reverts
to `none` but the residual annotations remain in the schema. While
mapping is off these
annotations are ignored and the columns resolve by logical name, so the
table is well-formed to
read, yet kernel rejected it on every read. This diverges from
delta-spark behavior.

**Fix:**

Kernel re-validates column-mapping annotations on every snapshot load,
via the shared
`make_physical` transform used by both the read and write paths.
delta-spark does not: its
`createPhysicalSchema` early-returns in `NoMapping` mode, ignoring the
annotations. This
change aligns the read path with that behavior:

1/ `make_physical` (read path) now tolerates a stale annotation in
`None` mode - it resolves
the field by its logical name and drops the column-mapping keys from the
physical schema,
yielding a schema indistinguishable from a table that never carried
them.
2/ The write path stays strict: CREATE TABLE and ALTER TABLE still
reject stale annotations,
so kernel never originates a table in this shape. Because
`make_physical` (shared by both
paths) is now lenient, the two builders run an explicit strict
column-mapping validation
pass to preserve that rejection. Making the write path
tolerate/normalize such tables to
  fully match delta-spark is tracked in delta-io#2885.

## How was this change tested?

- Unit tests for the validator's ignore-vs-reject behavior in `None`
mode (physicalName
only, id only, both), and that `make_physical` strips the column-mapping
keys while
preserving unrelated field metadata, at top level and on a nested leaf.
- Integration test that loads a snapshot from a table with residual
annotations (mode
  `none`) and reads data back end to end.
- Integration tests that CREATE TABLE and ALTER TABLE still reject stale
annotations while
  mapping is disabled.

---------

Co-authored-by: Sanuj Basu <sanujbasu@users.noreply.github.com>
… 1.97 (delta-io#2901)

## What changes are proposed in this pull request?

Rust 1.97.0 (2026-07-07) added an `into_array` method, which collides
with test-utils' `IntoArray::into_array` and breaks CI. This change
rename the trait method to `into_arrow_array`, which resolves the
collision.

## How was this change tested?
Pure rename, existing tests should suffice.
## What changes are proposed in this pull request?

This change adds reader write feature for the adaptive metadata tree as
outlined by delta-io/delta#6978

## How was this change tested?
## What changes are proposed in this pull request?

Adds `CheckpointScanShape` (in `kernel/src/checkpoint/`, behind
`declarative-plans`), driven by a `PlanExecutor`: resolves a scan's
checkpoint topology (`CheckpointShape` -- leaf vs manifest vs none) and,
when stats are requested, whether the checkpoint has parsed stats
(`CheckpointStatsInfo`).

Resolution prefers an applicable `_last_checkpoint` hint (sidecars /
checkpoint schema) to avoid reading the checkpoint, and falls back to a
footer read or a sidecar-column scan otherwise. Parsed-stats
availability is probed once, from the schema of whichever file holds the
add actions (the sidecar footer for a manifest, the checkpoint schema
for a parquet leaf).

Also adds `ParsedLogPath::is_json` to replace ad-hoc extension matching.

## Prior art (delta-io/delta)

Spark-Delta doesn't classify checkpoint shape in a single up-front pass;
it selects a `CheckpointProvider` subtype and resolves schema lazily per
file at scan time. The equivalent logic (pinned to
`delta-io/delta@55bf1e8`):

- **Topology (leaf / manifest / none)** --
[`Checkpoints.getCheckpointProvider`](https://github.com/delta-io/delta/blob/55bf1e899785008ca594cae5c4b79386c91c8ec7/spark/src/main/scala/org/apache/spark/sql/delta/Checkpoints.scala#L96)
dispatches by file format;
[`CheckpointProvider.apply`](https://github.com/delta-io/delta/blob/55bf1e899785008ca594cae5c4b79386c91c8ec7/spark/src/main/scala/org/apache/spark/sql/delta/CheckpointProvider.scala#L104)
resolves single-file V1-vs-V2 by `CheckpointMetadata` presence;
[`EmptyCheckpointProvider`](https://github.com/delta-io/delta/blob/55bf1e899785008ca594cae5c4b79386c91c8ec7/spark/src/main/scala/org/apache/spark/sql/delta/CheckpointProvider.scala#L353)
is the no-checkpoint case. A `V2CheckpointProvider` with non-empty
sidecars is the manifest case, empty is inline-V2 (leaf-like).
- **`_last_checkpoint` hint avoids reads** --
[`LastCheckpointInfo`](https://github.com/delta-io/delta/blob/55bf1e899785008ca594cae5c4b79386c91c8ec7/spark/src/main/scala/org/apache/spark/sql/delta/LastCheckpointInfo.scala#L102)
(`checkpointSchema`, `v2Checkpoint`) and
[`LastCheckpointV2`](https://github.com/delta-io/delta/blob/55bf1e899785008ca594cae5c4b79386c91c8ec7/spark/src/main/scala/org/apache/spark/sql/delta/LastCheckpointInfo.scala#L48)
(`sidecarFiles`, `nonFileActions`); read by
[`readLastCheckpointFile`](https://github.com/delta-io/delta/blob/55bf1e899785008ca594cae5c4b79386c91c8ec7/spark/src/main/scala/org/apache/spark/sql/delta/Checkpoints.scala#L369).
When the hint embeds sidecars,
[`v2ActionsFromLastCheckpointOpt`](https://github.com/delta-io/delta/blob/55bf1e899785008ca594cae5c4b79386c91c8ec7/spark/src/main/scala/org/apache/spark/sql/delta/CheckpointProvider.scala#L414)
skips the checkpoint read; when it carries `checkpointSchema`,
[`getParquetSchema`](https://github.com/delta-io/delta/blob/55bf1e899785008ca594cae5c4b79386c91c8ec7/spark/src/main/scala/org/apache/spark/sql/delta/CheckpointProvider.scala#L182)
skips the footer read.
- **Parsed-stats usability** -- the stats schema comes from the file
holding the add actions: the sidecar footer for a manifest (via
[`V2CheckpointProvider.allActionsFileIndexesAndSchemas`](https://github.com/delta-io/delta/blob/55bf1e899785008ca594cae5c4b79386c91c8ec7/spark/src/main/scala/org/apache/spark/sql/delta/CheckpointProvider.scala#L552),
sidecar schema preferring
[`CheckpointMetadata.sidecarFileSchema`](https://github.com/delta-io/delta/blob/55bf1e899785008ca594cae5c4b79386c91c8ec7/spark/src/main/scala/org/apache/spark/sql/delta/actions/actions.scala#L1639)),
or the checkpoint schema for a leaf. The read-time decision is in
[`Snapshot.loadActions`](https://github.com/delta-io/delta/blob/55bf1e899785008ca594cae5c4b79386c91c8ec7/spark/src/main/scala/org/apache/spark/sql/delta/Snapshot.scala#L557):
use `stats_parsed` iff the add schema has `stats_parsed` and lacks
`stats`. Note kernel's `schema_has_compatible_stats_parsed` does a
stronger compatibility check against the requested schema, rather than
Spark's field-name presence check.

## How was this change tested?

New unit tests over real fixtures: V2 json/parquet x manifest/leaf,
multi-part leaf, single-part leaf. A `CountingExecutor` asserts the hint
fast path performs exactly one sidecar footer read and no checkpoint
drain.
## What changes are proposed in this pull request?

The `column_name!` macro and friends are very nice for string literals,
but string literals are magic constants, subject to all the usual
problems: vulnerability to typos, hard to tell what's related vs. merely
similar, hard to rename/refactor, etc.

Expand the macro to allow 1+ compile-time constant path segments, where:
```rust
column_name!(ADD_NAME, "deletionVector.offset")
```
is equivalent to 
```rust
ColumnName::new([ADD_NAME, "deletionVector", "offset")
```

The generalized rule is that literals continue to split on `.` to become
simple path segments (as before), while other constant expressions must
be simple path segments (no dots, no special characters). Empty segments
and empty paths are rejected -- use `ColumnName::new` if you really want
that.

### This PR affects the following public APIs

Behavior change: The `column_name!` macro now requires at least one
argument and rejects empty path segments.

Expanded behavior: The `column_name!` macro now accepts multiple
arguments and string constants (not merely string literals).

## How was this change tested?

New unit tests and some existing code was ported to use the new macros.
…-io#2661)

## What changes are proposed in this pull request?

Some storage systems expose files through an authenticated REST "file
API" (list/read/write over HTTP) rather than a plain blob store. This PR
adds `RestObjectStore`, an `ObjectStore` over such an API so the default
engine can read and write Delta tables through it, plus FFI hooks on the
existing engine builder so a connector can construct a REST-backed
engine without a per-backend Rust impl.

- `AuthHeaderProvider` -- headers attached to every request
(auth/identity). Consulted per request so short-lived credentials can be
refreshed; `RefreshingHeaderProvider` caches them until shortly before a
caller-supplied TTL elapses, re-produce only then.
- `RestFileApiContract` -- the REST dialect: URL building, list/put
query params, list-response parsing, and HTTP-status-to-error mapping.
`RestEndpointConfig` is a data-driven contract configured by path-prefix
templates and JSON field names, so many backends need no bespoke Rust.

The store implements the operations Delta issues -- get, put, list (with
offset), and delete; copy, multipart, and delimited list return
`NotSupported`. It re-enforces two guarantees it can't trust the backend
for: list entries are verified sorted across pages (a mis-sort errors
out rather than silently corrupting log replay), and
`list_with_offset`'s exclusive offset is applied client-side.

### FFI engine builder

REST wiring lives in `ffi/src/rest_engine.rs` and plugs into the
existing `get_engine_builder` / `set_builder_option` / `builder_build`
flow:

1. `get_engine_builder(url)` -- for REST, `url` is the service base URL
(not a Delta table path).
2. `set_builder_rest_object_store(builder, endpoint_config, callback,
context)` -- selects `ObjectStoreBackend::Rest` and passes a `repr(C)`
`CRestEndpointConfig` for the file API dialect.
3. `set_builder_option` -- TLS, retries, and static auth via named
`REST_BUILDER_OPTION_*` keys (exported to C as `*_KEY` byte arrays).
Static `header.<Name>` options apply only when `callback` is null.
4. `builder_build(builder)` -- builds a `RestObjectStore` internally;
embedders never call `build_rest_object_store` directly.

For dynamic auth, pass a `CAuthHeaderCallback` that fills a
`CAuthHeaders` buffer (`headers[0..count]`, `ttl_ms`). When `callback`
is null, static headers come from `header.<Name>` builder options.

Gated behind the `default-engine` feature; adds optional
`async-trait`/`async-stream` deps and a `wiremock` dev-dependency.
Compiles against object_store 0.12 (arrow-57) and 0.13 (arrow-58).

### Customization triggers

The store stays minimal by default; a consumer opts into resilience and
refresh behavior:

- `with_max_retries(n)` -- retry transient failures (5xx,
connect/timeout) on idempotent requests with backoff. Default `0` (off).
- `with_verify_on_ambiguous(true)` -- on an ambiguous `Create` outcome
(5xx / dropped connection), read the object back so a write that
actually landed is not mistaken for a conflict. Default off.
- Auth: `StaticHeaderProvider` (fixed headers) or
`RefreshingHeaderProvider` (a closure returning `(headers,
Option<ttl>)`; cached until just before the TTL, otherwise re-produce
per request).
- Contract: `RestEndpointConfig` (data-driven path-prefix templates +
JSON field names) or a custom `RestFileApiContract`.

Through the FFI builder the same knobs are `set_builder_option` keys:
`REST_BUILDER_OPTION_RETRY_MAX_RETRIES`,
`REST_BUILDER_OPTION_PUT_VERIFY_ON_AMBIGUOUS`,
`REST_BUILDER_OPTION_HEADER_PREFIX` + header name,
`REST_BUILDER_OPTION_TLS_*`, plus the auth callback (with optional TTL).

### This PR affects the following public APIs

All additive (no breaking changes): `RestObjectStore`,
`AuthHeaderProvider`, `StaticHeaderProvider`,
`RefreshingHeaderProvider`, `RestFileApiContract`, `RestEndpointConfig`,
`RestListPage`, and the REST-related FFI exports
(`set_builder_rest_object_store`, `CRestEndpointConfig`, `CAuthHeaders`,
`REST_BUILDER_OPTION_*`, etc.).

## How was this change tested?

`wiremock`-backed unit tests cover get/put/list/delete, pagination, 404
-> NotFound (empty listing), 409 -> AlreadyExists, cross-page sort
enforcement, exclusive-offset filtering, retry, and verified-create. FFI
tests exercise `CRestEndpointConfig` conversion, auth callback/TTL
collection, builder option keys, and `build_rest_object_store` error
paths.
## Stacked PR

Splitting delta-io#2812 per review feedback. Each PR is based on `main`; use the
incremental link to review only this PR's changes.
- **stack/check-constraints-tokenizer** (this PR, delta-io#2882) -- bottom of
the stack, so its full diff is already incremental.
  - stack/check-constraints-parser (delta-io#2883)
    - stack/check-constraints-lower (delta-io#2884)

## What changes are proposed in this pull request?

We add a tokenizer as the first layer for this series of stacked PRs to
expand kernel's SQL parser to support predicates. The structure of these
PRs is meant for ease of integration when supporting more complex logic
in CHECKs down the road

## How was this change tested?

new UTs

---------

Co-authored-by: Michael Wang <m.wang@databricks.com>
Co-authored-by: Isaac <isaac@example.com>
…#2873)

## What changes are proposed in this pull request?

Updates the `Testing` guidance in `CLAUDE.md` to suggest
`TestTableBuilder` (`test_utils::table_builder`) when a test needs a
Delta table in a specific state, rather than hand-rolling commits.

- Adds a bullet in the `Testing` section suggesting the builder for
feature sets, partitioned/clustered layouts, checkpoints, CRC files,
hint states, and post-cleanup logs; loading snapshots via
`build_snapshot!`; and `default_sweep` for broad coverage. Notes that
lower-level setup like `test_table_setup` (or hand-rolled `add_commit` /
`LocalMockTable`) is the fallback for states the builder cannot express,
such as corrupt or malformed logs.
- Adds `TestTableBuilder` as the leading entry under **Common test
helpers -> Table creation in tests**, and clarifies when to reach for
the kernel `create_table` builder instead.

Docs-only; no code changes.

## How was this change tested?

N/A (documentation only).
…a-io#2905)

## What changes are proposed in this pull request?

Add an api `snapshot.built_as_latest`, which reflects if the snapshot
knows it's latest during build. The api will allow connectors to do log
cleanup on latest snapshot only(match spark).
<!--
**Uncomment** this section if there are any changes affecting public
APIs. Else, **delete** this section.
### 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?
Integration tests covers all combining cases on
catalog-managed/non-catalog-managed tables:
1. snapshot is built as latest or not + checkpoint/crc/incremental
build/post commit
2. fresh built/incremental built snapshot
## Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/2846/files) to
review incremental changes.
-
[**stack/column-defaults-v3-compat**](delta-io#2846)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2846/files)]
-
[stack/column-defaults-ffi-support](delta-io#2843)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2843/files/9a75abc1762fa8f6a5351fd8ee4ffc8e1afd51ce..e5a973763cf0c8a412d83eb332f6d3d2cae1f2ed)]

---------
## What changes are proposed in this pull request?
This PR adds IcebergCompatV3 enforcement of column-default rules. When
`icebergCompatV3` is enabled, transaction load now
validates every column default and warns on:
- non-literal defaults
- defaults on non-primitive columns

Additionally we move column default validation up to table configuration
so if a table has `CURRENT_DEFAULT` metadata that is non-string or the
column is variant type but non-null we throw an error.

## How was this change tested?
Unit and Integration Testing

## Resources
[Tracking
Issue](delta-io#2630)
## What changes are proposed in this pull request?

Release v0.26.0. Bumps all workspace crates from 0.25.0 to 0.26.0 and
regenerates `CHANGELOG.md` / `README.md` via `cargo release`.

Crates published from this release (in dependency order):
`delta_kernel_derive`, `delta_kernel`, `delta_kernel_default_engine`.

See `CHANGELOG.md` for the full list of changes since v0.25.0.

## How was this change tested?

Generated by the standard release tooling (`./release.sh 0.26.0`); full
workspace test suite passed as part of the pre-commit checks.
## What changes are proposed in this pull request?

Adds optional predicate pushdown (data skipping) to the incremental
scan. A new `IncrementalScanBuilder::with_predicate` restricts the
streamed live `Add` actions to those whose file stats do not provably
exclude the predicate, so a consumer can ask "what files changed in
`(base_version, target_version]` that could match P?" and get back only
the relevant added files instead of every changed file.

Skipping is conservative and reuses the same stats-based filter the read
path uses, so the surviving `Add` set is identical to what a full scan
at the target version with the same predicate would keep among those
added files. Files without stats are always kept, and `Remove` actions
are never filtered (consumers need every removal to evict stale cached
entries). With no predicate, the default path is unchanged.

The change-data-feed path already built a data-skipping filter over raw
`{ add, remove }` action batches by parsing `add.stats` JSON. That
construction is now a shared `DataSkippingFilter::for_raw_action_batch`
helper that both the CDF path and the incremental scan call, so the two
stay in lockstep with no duplicated logic.

## How was this change tested?

Added integration tests in `kernel/tests/incremental_scan.rs`: pushdown
drops non-matching added files, the `None` predicate path is unchanged,
files without stats are kept, removes are never filtered, static
skip-all and tautology predicates behave correctly, and the consumer
against-base classification composes with a predicate. The existing scan
and CDF suites pass unchanged, confirming the shared filter refactor is
behavior-preserving.
## What changes are proposed in this pull request?

Adds in calculation methods for computing field IDs for statistics
columns in the AMT. AMT stores statistics in individual column and
project is by field ID. This provides a helper method to calculate the
base statistics ID (statics for each column are grouped together) for a
given data or metadata field ID.

## How was this change tested?

Added unit tests.
…tes (delta-io#2897)

## What changes are proposed in this pull request?

Follow-up to delta-io#2886, which made kernel *read* a column-mapping-`none`
table carrying residual
`delta.columnMapping.*` field annotations. This closes the write-path
half tracked in delta-io#2885
(Gaps 1 and 2): kernel was stricter than delta-spark on writes, so an
ALTER on such a table was
rejected even when it only touched clean columns, and kernel had no way
to normalize these tables.

This matches delta-spark's `verifyAndUpdateMetadataChange` rule for
`NoMapping` writes. On a
`none`-mode CREATE / ALTER:

- If the current table has no column-mapping metadata and the write
introduces some, the
annotations are stripped from the persisted schema (mirroring
`dropColumnMappingMetadata`), so
  kernel never originates a self-inconsistent table.
- If the current table already carries residual annotations, they are
left in place. This is what
lets an ALTER touching only clean columns on a stale table succeed (Gap
1).

This replaces the read-side fix's temporary strict-reject on the two
write builders with the
strip. `Name` / `Id` mode is unchanged. The now-unused
`validate_schema_column_mapping_strict`
alias is removed.

Gap 3 from delta-io#2885 (collapsing the redundant second schema walk by
threading the policy through
`TableConfiguration::try_new`) is intentionally left for a separate PR.

New helpers `schema_has_column_mapping_metadata` and
`drop_column_mapping_metadata` in
`table_features::column_mapping` mirror delta-spark's
`schemaHasColumnMappingMetadata` and
`dropColumnMappingMetadata`. Both key off one shared set of
column-mapping metadata keys, so
detection and stripping stay symmetric.

## How was this change tested?

- Unit tests: `schema_has_column_mapping_metadata` detects a field
carrying any column-mapping
key by presence (id, physicalName, nested ids, parquet field id / nested
ids), including
physicalName-only and wrong-typed-id cases, and is false for a clean
schema;
`drop_column_mapping_metadata` removes those keys from every field (top
level, nested struct,
  and array/map leaves) while preserving unrelated metadata.
- Integration: CREATE with a stale-annotated schema (`none` mode) now
succeeds and persists a
stripped schema; ALTER add-column on an already-stale table succeeds and
leaves the pre-existing
annotation in place while the new field carries none; ALTER add-column
that introduces an
  annotation on a previously-clean table has it stripped.
- The read/append tolerance from delta-io#2886 remains covered.

---------

Co-authored-by: Sanuj Basu <sanujbasu@users.noreply.github.com>
## What changes are proposed in this pull request?
This PR adds fallback capability to PlanBasedEngine. Specifically, it
updates the constructor on `PlanBasedEngine` (and associated handlers)
such that callers can embed a separate `Engine` impl that will handle
any operations which we do not support via plan-based execution.

This serves as a compatibility layer such that the existing Engine
interfaces all continue to work even when declarative-plans is used for
certain APIs.

## How was this change tested?
Unit tests.
…delta-io#2906)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/2906/files) to
review incremental changes.
-
[**stack/uc-client-models**](delta-io#2906)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2906/files)] ←
_this PR_
-
[stack/uc-user-agent](delta-io#2909)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2909/files/ea47f4056ad37feff943e939a62f06c2e96b984d..95b2f21c16273531af03afb3478c8a1915a8097a)]
-
[stack/uc-e2e-smoke](delta-io#2925)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2925/files/95b2f21c16273531af03afb3478c8a1915a8097a..7f22ffb456761b0ff2d956382bb6a2a657b7500c)]
- [stack/uc-core](delta-io#2855)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2855/files/7f22ffb456761b0ff2d956382bb6a2a657b7500c..96781da6094eec3bebd7a1dfd86fa30065af3abe)]
-
[stack/uc-api-v2](delta-io#2826)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2826/files/96781da6094eec3bebd7a1dfd86fa30065af3abe..f981f90fefd45b33cfc59bfbfcadf9c06c4173ff)]

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

This change also adds an `UpdateTableClient` trait, and this change also
introduces the wire types for the Unity Catalog Delta-Tables API:
1. `update_table` request models (`Requirement`, `Update`,
`UpdateTableRequest`)
2. `load_table` read models (`LoadTableResponse`, `TableMetadata`)

These types are added alongside the crate's current models so the crate
and its downstream consumers keep compiling; a later PR swaps the
read/commit path onto them and removes the existing types.

## How was this change tested?
New unit tests, existing tests pass.
These wire types were also verified E2E through the UC OSS server at the
top of the stack.
…o#2909)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/2909/files/ea47f4056ad37feff943e939a62f06c2e96b984d..95b2f21c16273531af03afb3478c8a1915a8097a)
to review incremental changes.
-
[stack/uc-client-models](delta-io#2906)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2906/files)]
-
[**stack/uc-user-agent**](delta-io#2909)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2909/files/ea47f4056ad37feff943e939a62f06c2e96b984d..95b2f21c16273531af03afb3478c8a1915a8097a)]
← _this PR_
-
[stack/uc-e2e-smoke](delta-io#2925)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2925/files/95b2f21c16273531af03afb3478c8a1915a8097a..7f22ffb456761b0ff2d956382bb6a2a657b7500c)]
- [stack/uc-core](delta-io#2855)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2855/files/7f22ffb456761b0ff2d956382bb6a2a657b7500c..96781da6094eec3bebd7a1dfd86fa30065af3abe)]
-
[stack/uc-api-v2](delta-io#2826)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2826/files/96781da6094eec3bebd7a1dfd86fa30065af3abe..f981f90fefd45b33cfc59bfbfcadf9c06c4173ff)]

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

This change adds a `User-Agent` header to requests made by the UC REST
client. `ClientConfig` gains a `user_agent` field defaulting to
`Delta/<ver> delta-kernel-rs/<ver>`, with a
`ClientConfigBuilder::with_user_agent` override. This change replaces
the derived `Debug` on `ClientConfig` with a manual impl that redacts
the bearer token so it can't leak into logs.

## How was this change tested?
New unit tests, existing UC tests pass. This change was also tested E2E
on the OSS UC server at the top of the PR stack.
…oad_table (delta-io#2925)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/2925/files) to
review incremental changes.
-
[**stack/uc-e2e-smoke**](delta-io#2925)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2925/files)] ←
_this PR_
-
[stack/uc-log-tail](delta-io#2927)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2927/files/44b31cfc4b08b2452cee7bf63cfa27549949d413..e69233252f7036ff9a0f4174a1794663276a6af0)]
- [stack/uc-core](delta-io#2855)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2855/files/e69233252f7036ff9a0f4174a1794663276a6af0..911fa4d66bb4446a8eeb827cd196e61ddaccb4e9)]
-
[stack/uc-api-v2](delta-io#2826)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2826/files/911fa4d66bb4446a8eeb827cd196e61ddaccb4e9..f3a93309bbd18c365d4a2a7dad06665d4f08be66)]

---------
## What changes are proposed in this pull request?
This change adds get_config (protocol handshake) and load_table
(catalog-managed table metadata + unpublished commits) to UCClient. This
change also adds an E2E test against the OSS UC server, which is now a
new CI workflow.

## How was this change tested?
New CI tests against OSS UC server, new unit tests for added functions.
## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/2769/files) to
review incremental changes.
-
[**stack/interval_reads_engine**](delta-io#2769)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2769/files)] ←
_this PR_
-
[stack/interval-reads-feature](delta-io#2880)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2880/files/21a1fbb3f198f05ba8f40cf29ab57a472832dc91..602480e64fa74a0ef59015d1de282cf4a6fe10a5)]
-
[stack/interval_write_support](delta-io#2845)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2845/files/602480e64fa74a0ef59015d1de282cf4a6fe10a5..9b410235c9f1ea6820c94b98ab30ccf848759e42)]
-
[stack/interval_scalars](delta-io#2854)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2854/files/9b410235c9f1ea6820c94b98ab30ccf848759e42..68137785f0369cd0dbf1d42d68cdb433f30aad0b)]
-
[stack/interval_ffi_changes](delta-io#2903)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2903/files/68137785f0369cd0dbf1d42d68cdb433f30aad0b..5dee84148065e9c5b3513cd6d46b85af9fae28c6)]

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

Support interval types in default engine. Use raw Arrow::Int for
interval types, gracefully error everywhere else (Scalars, stats, etc.).
We assume raw int32/int64 in Parquet, as per the
[RFC](delta-io/delta#7078).

This should remain open until RFC gets merged in as an official
proposal.

## How was this change tested?

Existing `intv_*` tests pass, new unit tests added & existing unit tests
modified.

---------

Co-authored-by: Ayush Raj <a.raj@databricks.com>
## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/2880/files/21a1fbb3f198f05ba8f40cf29ab57a472832dc91..602480e64fa74a0ef59015d1de282cf4a6fe10a5)
to review incremental changes.
-
[stack/interval_reads_engine](delta-io#2769)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2769/files)]
-
[**stack/interval-reads-feature**](delta-io#2880)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2880/files/21a1fbb3f198f05ba8f40cf29ab57a472832dc91..602480e64fa74a0ef59015d1de282cf4a6fe10a5)]
← _this PR_
-
[stack/interval_write_support](delta-io#2845)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2845/files/602480e64fa74a0ef59015d1de282cf4a6fe10a5..9b410235c9f1ea6820c94b98ab30ccf848759e42)]
-
[stack/interval_scalars](delta-io#2854)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2854/files/9b410235c9f1ea6820c94b98ab30ccf848759e42..68137785f0369cd0dbf1d42d68cdb433f30aad0b)]
-
[stack/interval_ffi_changes](delta-io#2903)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2903/files/68137785f0369cd0dbf1d42d68cdb433f30aad0b..5dee84148065e9c5b3513cd6d46b85af9fae28c6)]

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

Introduce a new reader-writer table feature `intervalType-preview` gated
on a feature flag. Enable reads and CDF of Delta tables with this table
feature enabled, but keep writes disabled (this will change in the next
PR in the stack).

## How was this change tested?

New unit tests + integration test.

---------

Co-authored-by: Ayush Raj <a.raj@databricks.com>
…elta-io#2926)

## What changes are proposed in this pull request?

Expose several internal apis for connectors to do log cleanup

<!--
**Uncomment** this section if there are any changes affecting public
APIs. Else, **delete** this section.
### 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?
n/a
…elta-io#2927)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/2927/files) to
review incremental changes.
-
[**stack/uc-log-tail**](delta-io#2927)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2927/files)] ←
_this PR_
-
[stack/uc-credentials](delta-io#2934)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2934/files/ca7ca9ec8dc8bcd8d1a5ddbfe513ac53c86bc868..fb90f1d858abde94e30c0206a8ccaa0f2fd3413d)]
-
[stack/uc-create-wire-types](delta-io#2941)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2941/files/fb90f1d858abde94e30c0206a8ccaa0f2fd3413d..1b95da077071fe133be2d62f94e965299432f2ff)]
- [stack/uc-core](delta-io#2855)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2855/files/1b95da077071fe133be2d62f94e965299432f2ff..872dd5191f189d909690657499f502587259732f)]
-
[stack/uc-api-v2](delta-io#2826)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2826/files/872dd5191f189d909690657499f502587259732f..d671a80f9f394c62f32938bfbffe5598a23517ab)]

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

This change extracts the inline UC commit to LogPath conversion out of
`UCKernelClient::load_snapshot_inner` into a standalone function. This
refactor helps lay the groundwork for the upcoming Delta-Tables
`load_table` API in an upcoming change.

## How was this change tested?

New unit tests, existing UC tests pass.
…thod (delta-io#2934)

## 🥞 Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/2934/files) to
review incremental changes.
-
[**stack/uc-credentials**](delta-io#2934)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2934/files)] ←
_this PR_
-
[stack/uc-create-wire-types](delta-io#2941)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2941/files/f16e03fe0ff66ec92b98517a1d98d3b12b44ad71..f384c8318061a9212f0ae6c5cf3d9817a9af620b)]
- [stack/uc-core](delta-io#2855)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2855/files/f384c8318061a9212f0ae6c5cf3d9817a9af620b..72270d2f0e9e614a661d4797a955c527b5147d8f)]
-
[stack/uc-api-v2](delta-io#2826)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/2826/files/72270d2f0e9e614a661d4797a955c527b5147d8f..7f3143cb0a1ad4b2368ceabd4729120bf6197a7b)]

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

Adds the Delta Tables API credential surface to the UC client crates.
Once the read path swaps with the legacy UC API, we will delete the old
credential equivalents.

## How was this change tested?

New UT, new integration test against the OSS UC server, existing UC
client/kernel tests pass.
…o#2943)

## What changes are proposed in this pull request?
In the current implementation of PlanBasedEngine's FFI, it drops the
underlying "fallback engine" when the plan-based engine itself is
dropped.

While this is a valid convention, this complicates the Java side because
there are Java-side resources that must also be closed. So then we would
have to implement an ownership transfer on Java side to ensure that the
handle is not double freed, but the Java resources ARE freed, when the
PlanBasedEngine is closed.

To simplify this, this PR just changes the ownership semantics such that
the consumer must drop both the fallback engine and plan-based engine
separately. This simplifies the Java side because the plan-based wrapper
can just directly call the fallbaack engine's `close` method (as part of
it's own close method).

## How was this change tested?
Unit tests
…elta-io#2883)

## Stacked PR

Splitting delta-io#2812 per review feedback. Each PR is based on `main`; use the
incremental link to review only this PR's changes.
- stack/check-constraints-tokenizer (delta-io#2882)
- **stack/check-constraints-parser** (this PR, delta-io#2883) -- [incremental
changes](https://github.com/delta-io/delta-kernel-rs/pull/2883/files/05391afb9a674f62d032e8ecaff90dc6cef12351..076f5195c7e006821dd2023cd06dcdaa47a134f5)
    - stack/check-constraints-lower (delta-io#2884)

## What changes are proposed in this pull request?

Adds the parser that consumes the token stream from the tokenizer
(delta-io#2882) and produces
a `Comparison` -- exactly one `operand <op> operand`, including the
null-safe `<=>`
operator and signed numeric literal (`-234` and '- 234'). Junctions
(`AND`/`OR`/`NOT`),
parentheses, and `IS [NOT] NULL` are out of grammar and rejected (the
caller treats that
as "not kernel-parsable"); keyword tokens are rejected wherever they
appear.

## How was this change tested?

New UTs

---------

Co-authored-by: Michael Wang <m.wang@databricks.com>
Co-authored-by: Isaac <isaac@example.com>
Co-authored-by: Ken Li <kenneth.li87@gmail.com>
## What changes are proposed in this pull request?

Exposes the incremental scan API through the C FFI. The kernel API
(`Snapshot::incremental_scan_builder`) was reachable only by linking the
Rust crate directly; this lets connectors that consume kernel through
the C FFI use it too.

The surface mirrors the existing `commit_range` and scan iterator
conventions:

- `snapshot_incremental_scan_builder` builds a range `(base_version,
target_version]` from a snapshot.
- `incremental_scan_builder_build` returns an `OptionalValue<stream>`,
modeling the kernel's `Option` return so callers get the
full-scan-fallback signal (`None` when the snapshot's commit list can't
cover the range) rather than an error.
- `incremental_scan_stream_next_arrow` drains live-Add batches as Arrow
C Data Interface data, newest commit first.
- `incremental_scan_stream_into_summary` consumes the stream and returns
the live-Add and Remove file-key sets, read back via
`incremental_scan_summary_visit_live_adds` / `_visit_removes` callbacks
that surface each `(path, dv_unique_id)` key.

The stream handle wraps the kernel stream in a mutex behind a shared
handle (the stream is `Send` but not `Sync`) and retains an engine `Arc`
so the reader's runtime outlives the caller's own engine handle. Only
`into_summary` is exposed as a terminal for now; the against-base
terminals are deferred, and the FFI docs point callers at the manual
`removes union (base intersect live_adds)` mask in the meantime.

## How was this change tested?

New FFI unit tests in `ffi/src/incremental_scan.rs` cover build to
summary, Arrow batch draining, the empty-range error, deletion-vector
key round-trip, the double-consume guards, stream abandonment, and
drain-on-partial-read. `cargo nextest run -p delta_kernel_ffi
--all-features`, clippy, and `cargo doc` pass.
## What changes are proposed in this pull request?
Removes the column default in dev feature following delta-io#2846 and enables
the feature in kernel.

## How was this change tested?
Passing all tests and added some new integration tests.

## Resources
[Tracking
Issue](delta-io#2630)
## What changes are proposed in this pull request?

While building incremental CRC, we had removed the LazyCrc construct.
However, that was premature, as we ended up deciding to making
incremental CRC replaying during Snapshot construction optional.

This PR re-introduces the cached CRC construct.

A Snapshot can have a CRC, and that CRC can be at-latest,
incrementally-dervived-to-latest, or stale.

This PR introduced `SnapshotCrc` which is a wrapper that guards access
to the CRC so that callers always know if they are accessing the latest
CRC or a potentially-stale one.

This is a building block for DomainMetadata and SetTxn queries that are
rooted in CRC and in Snapshots that were not built via incremental state
replay.

## How was this change tested?

New UTs.
DrakeLin and others added 26 commits September 8, 2026 21:00
## What changes are proposed in this pull request?

Treat negative add/remove file sizes as unsafe for incremental CRC
file-stat replay. Snapshot loading now degrades file statistics to
`Indeterminate` instead of propagating a cast or histogram error.

Closes delta-io#2676.

## How was this change tested?

- `cargo nextest run -p delta_kernel --lib --all-features
negative_size_trips_is_incremental_safe`
- `cargo clippy -p delta_kernel --lib --all-features -- -D warnings`
- `cargo doc --workspace --all-features --no-deps`

The full workspace clippy command currently hits an unrelated
`clippy::redundant_closure` error in `ffi/src/ffi_tracing.rs:381` on
upstream `main`.
## What changes are proposed in this pull request?

The C FFI schema visitor could not construct a kernel schema containing
a `void` field because it
had no outbound `visit_field_void` entry point. This prevented FFI-based
engines from round-tripping
an existing VOID-bearing schema, including using that schema as a read
projection.

This PR adds `visit_field_void`, backed by the existing primitive-field
visitor implementation, so
engines can add `PrimitiveType::Void` fields through the C boundary. The
read-table C example now
dispatches VOID fields as well, and its CTest projects `id,void_col`
from the existing VOID fixture
and compares the generated Arrow output against a checked-in golden
file.

## How was this change tested?

```bash
cargo +nightly fmt
cargo clippy -p delta_kernel_ffi --all-features -- -D warnings
cargo nextest run -p delta_kernel_ffi --all-features test_schema_all_types

cargo build -p delta_kernel_ffi --features tracing
cmake -S ffi/examples/read-table -B ffi/examples/read-table/build
cmake --build ffi/examples/read-table/build
(cd ffi/examples/read-table/build && ctest -R '^read_and_print_void_col$' --output-on-failure)
(cd ffi/examples/read-table/build && ctest --output-on-failure)
```
## What changes are proposed in this pull request?

Classifies log-segment failures as `MissingVersion`,
`InvalidCheckpoint`, or `InvalidLogSegment` instead of generic errors.
Missing-version errors now include the affected version when known, with
corresponding FFI mappings and test coverage.

## How was this change tested?

All unit tests and integration tests pass.
…tes (delta-io#3249)

## What changes are proposed in this pull request?

Note to reviewers: Please don't be intimidated by the 700+ LOC size of
this PR. It's about 55% test code, 25% prod code, with the rest
comments/blank lines.

Incremental snapshot updates normally adopt a newer checkpoint, which
removes commit-file metadata covered by that checkpoint from the
snapshot. Conflict rebasing instead needs every winning commit since the
transaction's read snapshot.

For example, a transaction may read snapshot N and attempt to commit at
N+1, while commits N+1 through N+5 win first. If a checkpoint exists at
N+3, adopting it hides the N+1 and N+2 commit files needed for conflict
analysis.

This adds `IncrementalSnapshotBuilder::skip_new_checkpoints()`. The
opt-in mode still discovers checkpoints, but retains the input
snapshot's checkpoint and every contiguous commit after it.
`CommitRange::builder_from` can then inspect the complete winning range
without listing the log again. Default incremental updates continue to
adopt useful checkpoints.

Full scans warn when retained history may require extra log replay, and
writing a checkpoint clears that state.

### This PR affects the following public APIs

- Adds the `IncrementalSnapshotBuilder` alias and its
`skip_new_checkpoints()` method.
- Adds a source-mode type parameter to `SnapshotBuilder`;
`Snapshot::builder_from` now returns
  `IncrementalSnapshotBuilder`.

## How was this change tested?

- Added unit coverage for checkpoint retention, repeated updates,
missing commit history, scan warnings, and incremental CRC replay.
- Added integration coverage for catalog-provided log tails and
snapshot-derived commit ranges that reuse the original listing.
- Ran `cargo +nightly fmt --check`, workspace clippy with all features
and warnings denied, and workspace documentation checks.
## Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/3268/files) to
review incremental changes.
-
[stack/read-stable-ver](delta-io#3224)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/3224/files)]
[MERGED]
-
[stack/builder-ctx](delta-io#3226)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/3226/files)]
[MERGED]
-
[stack/rc-metadata-write](delta-io#3229)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/3229/files)]
[MERGED]
-
[stack/ack-rc-preserve](delta-io#3252)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/3252/files)]
[MERGED]
-
[**stack/emit-preserve-flag**](delta-io#3268)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/3268/files)] ←
_this PR_

---------
## What changes are proposed in this pull request?
emit row tracking preservation tag in commitInfo


## How was this change tested?
integration tests include:
- create/alter table txns
- row tracking supported, suspended, enabled
- connector supply tags in commitInfo or not
## What changes are proposed in this pull request?

Publish automatic AI reviews triggered by `pull_request_target` as
inline reviews instead of
workflow summaries. Explicit `/review` options and workflow-dispatch
output modes remain unchanged.

Add a source-contract unit test that keeps the automatic default pinned
to inline.

## How was this change tested?

- Python inline-review unit tests
- Workflow YAML parsing
- `cargo +nightly fmt`
- `cargo clippy --workspace --benches --tests --all-features -- -D
warnings`
- `cargo doc --workspace --all-features --no-deps`
## Stacked PR
Use this
[link](https://github.com/delta-io/delta-kernel-rs/pull/3222/files) to
review incremental changes.
-
[**snapshot-hint**](delta-io#3222)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/3222/files)]
<- _this PR_
-
[snapshot-hint-ffi](delta-io#3284)
[[Files
changed](https://github.com/delta-io/delta-kernel-rs/pull/3284/files/aa3f34296d2e93a7d257ef633cf53add8dc22b48..2c1a56ec5d7fdccfbc1dfdb6ad46fbd6dc6ae9d9)]

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

This PR adds an `internal-api` path for building a snapshot from
complete caller-supplied state.
It lets a connector reuse state it already has without asking the engine
to list or read the Delta
log again.

```rust
let hint = SnapshotHint {
    version,
    log_segment_files,
    protocol,
    metadata,
    last_checkpoint_hint,
    crc,
    version_status: SnapshotHintVersionStatus::Latest,
};

let snapshot = Snapshot::builder_for(table_root)
    .with_snapshot_hint(hint)
    .build(engine)?;
```

The existing `build(engine)` API is unchanged. The engine is accepted
but is not used when a
complete hint is present.

Kernel still validates the supplied state:

- The log segment must be complete and valid for the hinted version.
- Protocol and metadata must form a valid table configuration.
- A supplied CRC must match the hint version, protocol, and metadata.
- Conflicting builder options, such as a log tail or incremental CRC
replay, are rejected.
- `Latest` marks the snapshot as latest. `Unverified` does not;
freshness remains the connector's
  responsibility.

Snapshot metrics now include `load_type = snapshot_hint`. A hinted build
emits the normal snapshot
success or failure event, but no child log-load or I/O events because it
performs no engine I/O.
`CountingReporter` exposes this as one counter family labeled by
completion status and load type:

```rust
let successes = reporter.snapshot_completion_count(
    SnapshotCompletionStatus::Success,
    SnapshotLoadType::SnapshotHint,
);
```

The Rust-to-C metric mapping appends the new load type, and the FFI
error mapping appends
`InvalidSnapshotHint`. 

### This PR affects the following public APIs

- Under `internal-api`, adds `SnapshotHint`,
`SnapshotHintVersionStatus`, and
  `SnapshotBuilder::with_snapshot_hint`.
- Adds `SnapshotLoadType::SnapshotHint` and `Error::SnapshotHint`.
- `CountingReporter::snapshot_completion_count` queries the completion
counter by
  `SnapshotCompletionStatus` and `SnapshotLoadType`.
- Appends matching FFI enum variants for the new load type and error.

## How was this change tested?

```shell
cargo nextest run --locked --workspace --all-features \
  -E 'not test(read_table_version_hdfs) and not test(invalid_handle_code)'
cargo +nightly fmt
cargo clippy --workspace --benches --tests --all-features -- -D warnings
cargo doc --workspace --all-features --no-deps
```
)

## What changes are proposed in this pull request?

Kernel currently has a lot of infrastructure to provide the
`EvaluationHandler::create_one` convenience wrapper. It predates both
`EvaluationHandler::create_many` and more recently-added
struct-to-scalar conversion capability.

Remove all that legacy cruft and use `create_many` everywhere. Introduce
a new freestanding (one-liner) `create_row` function in its place. Also
remove `EvaluationHandler::create_null`, which has only one prod use
site.

While we're at it, change `create_many` signature to require owned
input, observing that all callers could easily provide owned data (all
own the input and none need to reuse it afterward; some have to manually
extract borrowed slices from their owned values in order to satisfy the
current API).

### This PR affects the following public APIs

`EvaluationHandler::create_many` now requires owned `Vec<Vec<Scalar>>`.

Removed `EvaluationHandler::create_null` method. Use `create_many`
instead.

The `EvaluationHandlerExtension` trait was removed. Use the new
`create_row` helper instead.

The `IntoEngineData` trait was removed, along with its companion derive
macro. Derive `IntoStructData` instead.

The `Error::LiteralExpressionTransformError` variant was removed and FFI
error updated to match.

## How was this change tested?

Lots of unit tests cover this code.
## What changes are proposed in this pull request?

Small change. Validate that multipart checkpoints declare at least two
parts and contain unique part numbers within the declared range.

Fixes delta-io#3297. Follow-up to:
delta-io#3222 (comment)

## How was this change tested?

- Focused multipart checkpoint tests
- Workspace clippy and docs
- Full workspace test suite
## What changes are proposed in this pull request?

The MODIFIED status is not part of the RFC:


https://github.com/delta-io/delta/blob/master/protocol_rfcs/iceberg-v4-metadata.md#tracking


<!--
**Uncomment** this section if there are any changes affecting public
APIs. Else, **delete** this section.
### 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?
To align the code with the docs:


https://github.com/delta-io/delta/blob/master/protocol_rfcs/iceberg-v4-metadata.md#tracking

## What changes are proposed in this pull request?

<!--
**Uncomment** this section if there are any changes affecting public
APIs. Else, **delete** this section.
### 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?
## What changes are proposed in this pull request?

This updates the experimental AI reviewer in four ways:

- Treat source TODOs as durable review state. A defect already described
by a nearby TODO or FIXME
with a concrete issue reference, such as `TODO(delta-io#3297)`, is omitted. New
or changed untracked
TODOs are reported as non-blocking notes unless the incomplete behavior
is blocking.
- Read bounded prior AI review history before each run. The orchestrator
and sub-agents omit
semantically duplicate findings, while publication independently
suppresses exact duplicate
comments. History is accepted only from the expected bot login with the
AI review marker, sorted
newest-first across comments and reviews, and treated as untrusted text.
The GitHub Actions bot is
trusted by default; a named Omnigent App can be added with
`OMNIGENT_BOT_LOGIN`.
- Avoid duplicating inline findings in the main review body. Findings
attached to diff lines and
exact duplicates of prior inline comments are removed from the collapsed
body; findings that
cannot be mapped remain there with the overall summary. A valid mapped
machine finding is still
published if its prose heading is missing. Malformed Markdown fails open
so body cleanup cannot
  delete unrelated findings or summary text.
- Publish the final complete revision from a multi-turn reviewer
transcript. Marker pairs must be
complete and non-nested; malformed sequences still fail closed. The
orchestrator also tracks
  every dispatched reviewer before emitting a marked result.

Finding IDs are run-local and are not used for cross-run matching. If
GitHub history retrieval
fails, review continues without cross-run deduplication.

The end-to-end behavior is being exercised on draft PR delta-io#3300. That PR
contains intentional review
targets and must not be merged.

Prompt-source deduplication is intentionally separate in draft PR delta-io#3305.

## How was this change tested?

- 55 AI reviewer Python tests, including spoofed bot identities,
malformed and non-UTF-8 history,
chronological history limits, side-aware exact duplicates, off-diff
findings, malformed Markdown,
balanced-fence recovery, corrected review revisions, reviewer-output
grammar, and inline/body
  separation
- Python compilation and YAML parsing for the workflow and reviewer
configs
- Live GraphQL validation of the GitHub Actions bot identity
- Exact-branch workflow runs against draft PR delta-io#3300: tracked-TODO
suppression, semantic and exact
duplicate suppression, inline findings omitted from the collapsed body,
and neutral check
  publication
- Final exact-branch inline run at `10d6ca35`:
  https://github.com/delta-io/delta-kernel-rs/actions/runs/34559393303
- Full repository pre-commit checks: nightly rustfmt, Clippy, Rust tests
and doctests, and coverage
## What changes are proposed in this pull request?

Promote an element-level cast discovered while planning a Parquet list
read into a cast of the complete list column. Arrow then recursively
converts the values while preserving the list wrapper, instead of
attempting the invalid `List<Int32> -> Int64` cast.

The regression test recreates the reported table shape in memory: a V0
Parquet file stores `array<int>`, V1 changes the table schema to
`array<long>`, and the scan verifies the older values are returned as
`Int64`.

Closes delta-io#2188.

## How was this change tested?

- `cargo nextest run -p delta_kernel --test integration --all-features
type_widening`
- `cargo clippy -p delta_kernel --all-targets --all-features -- -D
warnings`
- `cargo doc --workspace --all-features --no-deps`
## What changes are proposed in this pull request?

Use each reviewer bundle's `REVIEW.md` as its executable Omnigent prompt
through
`instructions: REVIEW.md`. This removes the duplicate prompt body from
every `config.yaml` while
keeping the Markdown files directly usable by local review agents.

The Markdown bodies match the hardened inline prompts from the rebased
parent, preserving bounded
read-only source-tool access, offline Delta protocol references, and
untrusted-source guidance.
Runtime validation loads every reviewer bundle and verifies that its
resolved instructions match
the adjacent Markdown file. Operator guidance now lives in
`reviewer/README.md`.

This is a cleanup follow-up to delta-io#3299 and remains separate from that
behavior change.

## How was this change tested?

- 63 AI reviewer Python tests
- YAML parsing for every reviewer config and the workflow
- Exact comparison of all 8 Markdown prompts with the rebased parent
prompts
- Exact-branch artifact run against draft experiment PR delta-io#3300:
  https://github.com/delta-io/delta-kernel-rs/actions/runs/34648053845
## What changes are proposed in this pull request?

This PR exposes typed snapshot hints through the C FFI. Connectors can
provide the complete state needed to construct a snapshot - including
log paths, protocol, metadata, checkpoint state, and optional CRC state
- using `snapshot_builder_set_snapshot_hint`.

The setter copies borrowed FFI inputs into owned kernel values. During
build, kernel validates the log-segment shape, table configuration, and
CRC consistency, then constructs the snapshot without storage I/O. The
connector remains responsible for path provenance and its latest-version
claim.

### This PR affects the following public APIs

- Adds `FfiSnapshotHint` and its nested borrowed FFI types.
- Adds `snapshot_builder_set_snapshot_hint`.
- Adds snapshot-hint reconstruction APIs under the experimental
`internal-api` feature.

Follow-up validation and FFI consistency work is tracked in delta-io#3309,
delta-io#3310, and delta-io#3311.

## How was this change tested?

```shell
cargo nextest run -p delta_kernel_ffi --all-features
cargo nextest run -p delta_kernel --lib --all-features crc
cargo nextest run -p delta_kernel --lib --all-features snapshot_hint
cargo +nightly fmt --check
cargo clippy --workspace --benches --tests --all-features -- -D warnings
cargo doc --workspace --all-features --no-deps
```
…ta-io#3313)

## What changes are proposed in this pull request?
doc the type widening expectation for `ParquetHandler` impl
resolves delta-io#1612
<!--
**Uncomment** this section if there are any changes affecting public
APIs. Else, **delete** this section.
### 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?
doc only
## What changes are proposed in this pull request?
This PR adds a new tracing `Layer` which emits "frame" events. Within
kernel functions, we can opt-in a callsite by adding an
`enable_call_frame` field on the tracing annotation. When the layer
receives span events with such a field, it will emit an
OPEN/CLOSE signal so that subscribers can build up a frame profile using
timings in between events.

The expectation is that the reporting callback runs on the same thread
as the invoked function, so that subscribers can maintain a frame stack
in some sort of thread-local context.

This PR also adds the necessary FFI bindings, though it does not
explicitly enable any call sites to emit call frames.

## How was this change tested?
Unit tests
## What changes are proposed in this pull request?

Harden the Kernel release workflow:

- allow maintainers to select an alternate Cargo registry without
editing `release.sh`
- add an idempotent changelog refresh command plus CI verification so
PRs merged while a release
  PR is open cannot be silently omitted
- restrict Kernel release boundaries to semantic-version tags so
artifact tags such as
  `v0.0.1_dat` cannot truncate the changelog

Changelog verification uses git-cliff's own filtered commit context and
reachable branch tags,
runs only on `release/` branches, and fails closed if its tooling cannot
resolve the release range.
A failed refresh restores the existing changelog.

This complements delta-io#3066, which handles independently versioned UC crates.
Its suffixed per-crate
tags are deliberately excluded from Kernel changelog boundaries.

## How was this change tested?

- `.github/scripts/test-release.sh` with git-cliff 2.10.1, covering
alternate-registry forwarding,
artifact and divergent tags, late PRs, skipped release commits,
idempotent refresh, and failure
  restoration
- `./release.sh verify-changelog`
- `bash -n` and ShellCheck 0.10.0
- actionlint 1.7.7
- `cargo +nightly fmt -- --check`
- `cargo doc --workspace --all-features --no-deps`
…o#3274)

## What changes are proposed in this pull request?
Short term solution mentioned in
delta-io#3263


<!--
**Uncomment** this section if there are any changes affecting public
APIs. Else, **delete** this section.
### 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?
positive test: all kernel data types; nested mismatches
negative test: all validation failure cases including missing,
mismatching fields
)

## What changes are proposed in this pull request?
Followup to delta-io#3306.

Adds tracing annotations in order for kernel-rs to start emitting frame
graph events on notable call sites. Specifically targeting 1) Scan and
2) Snapshot construction.

## How was this change tested?
Tested against e2e prototype
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.