feat: allow materializePartitionColumns feature signal in CREATE TABLE#2481
Merged
sanujbasu merged 1 commit intodelta-io:mainfrom Apr 28, 2026
Merged
Conversation
7 tasks
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #2481 +/- ##
=======================================
Coverage 88.43% 88.43%
=======================================
Files 178 178
Lines 58417 58417
Branches 58417 58417
=======================================
Hits 51660 51660
Misses 4787 4787
Partials 1970 1970 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
This was referenced Apr 28, 2026
sanujbasu
added a commit
to sanujbasu/delta-kernel-rs
that referenced
this pull request
Apr 28, 2026
## What changes are proposed in this pull request? Fixes delta-io#2465. Closes the write-time enforcement gap left by delta-io#2418, which auto-enables the invariants writer feature on schemas with non-null columns but does not itself reject nulls on writes. Kernel now rejects Scalar::Null partition values for partition columns with nullable: false in partitioned_write_context, matching Delta-Spark's DELTA_NOT_NULL_CONSTRAINT_VIOLATED (SQLSTATE 23502). The check sits in validate_types alongside the existing type checks. The Scalar::Null inner type continues to be ignored on nulls, so connectors can keep constructing null partition values without first looking up the schema; only the schema field's nullability is enforced. This matches Catalyst's NullType permissiveness and the type-erased on-wire format (partitionValues serializes nulls as JSON null with no type information). ## How was this change tested? Adds integration tests covering all three non-null write paths: 1/ Non-materialized partitioned writes (default): kernel rejects the null Scalar at partitioned_write_context time, before serialization. Covered across all column-mapping modes via the kernel create_table builder. 2/ Materialized partitioned writes (materializePartitionColumns): kernel delegates to the engine's ParquetHandler. The default engine inherits the guarantee from arrow-rs, whose RecordBatch::try_new rejects nulls in fields with nullable: false. The table for this case is set up via the kernel create_table builder with delta.feature.materializePartitionColumns=supported (allow-listed by delta-io#2481). 3/ Plain non-null data columns: same engine-delegation seam, exercised across a representative primitive type matrix (integer, long, string, binary, boolean, timestamp, decimal). The table is created via the kernel create_table builder so the non-null schema drives the auto-enablement of the invariants writer feature end-to-end; the test asserts both the auto-enable and the downstream RecordBatch::try_new rejection. Pins the full chain documented on maybe_enable_invariants in transaction/builder/create_table.rs. Local verification: 1/ cargo +nightly fmt --check 2/ cargo clippy --workspace --benches --tests --all-features -- -D warnings 3/ cargo doc --workspace --all-features --no-deps 4/ cargo test -p delta_kernel --all-features for affected paths
173d724 to
f731408
Compare
sanujbasu
added a commit
to sanujbasu/delta-kernel-rs
that referenced
this pull request
Apr 28, 2026
## What changes are proposed in this pull request? Fixes delta-io#2465. Closes the write-time enforcement gap left by delta-io#2418, which auto-enables the invariants writer feature on schemas with non-null columns but does not itself reject nulls on writes. Kernel now rejects Scalar::Null partition values for partition columns with nullable: false in partitioned_write_context, matching Delta-Spark's DELTA_NOT_NULL_CONSTRAINT_VIOLATED (SQLSTATE 23502). The check sits in validate_types alongside the existing type checks. The Scalar::Null inner type continues to be ignored on nulls, so connectors can keep constructing null partition values without first looking up the schema; only the schema field's nullability is enforced. This matches Catalyst's NullType permissiveness and the type-erased on-wire format (partitionValues serializes nulls as JSON null with no type information). ## How was this change tested? Adds integration tests covering all three non-null write paths: 1/ Non-materialized partitioned writes (default): kernel rejects the null Scalar at partitioned_write_context time, before serialization. Covered across all column-mapping modes via the kernel create_table builder. 2/ Materialized partitioned writes (materializePartitionColumns): kernel delegates to the engine's ParquetHandler. The default engine inherits the guarantee from arrow-rs, whose RecordBatch::try_new rejects nulls in fields with nullable: false. The table for this case is set up via the kernel create_table builder with delta.feature.materializePartitionColumns=supported (allow-listed by delta-io#2481). 3/ Plain non-null data columns: same engine-delegation seam, exercised across a representative primitive type matrix (integer, long, string, binary, boolean, timestamp, decimal). The table is created via the kernel create_table builder so the non-null schema drives the auto-enablement of the invariants writer feature end-to-end; the test asserts both the auto-enable and the downstream RecordBatch::try_new rejection. Pins the full chain documented on maybe_enable_invariants in transaction/builder/create_table.rs. Local verification: 1/ cargo +nightly fmt --check 2/ cargo clippy --workspace --benches --tests --all-features -- -D warnings 3/ cargo doc --workspace --all-features --no-deps 4/ cargo test -p delta_kernel --all-features for affected paths
f731408 to
fe9319d
Compare
scottsand-db
requested changes
Apr 28, 2026
Collaborator
scottsand-db
left a comment
There was a problem hiding this comment.
Looks good but I think we can re-use an existing test setup?
sanujbasu
added a commit
to sanujbasu/delta-kernel-rs
that referenced
this pull request
Apr 28, 2026
## What changes are proposed in this pull request? Fixes delta-io#2465. Closes the write-time enforcement gap left by delta-io#2418, which auto-enables the invariants writer feature on schemas with non-null columns but does not itself reject nulls on writes. Kernel now rejects Scalar::Null partition values for partition columns with nullable: false in partitioned_write_context, matching Delta-Spark's DELTA_NOT_NULL_CONSTRAINT_VIOLATED (SQLSTATE 23502). The check sits in validate_types alongside the existing type checks. The Scalar::Null inner type continues to be ignored on nulls, so connectors can keep constructing null partition values without first looking up the schema; only the schema field's nullability is enforced. This matches Catalyst's NullType permissiveness and the type-erased on-wire format (partitionValues serializes nulls as JSON null with no type information). ## How was this change tested? Adds integration tests covering all three non-null write paths: 1/ Non-materialized partitioned writes (default): kernel rejects the null Scalar at partitioned_write_context time, before serialization. Covered across all column-mapping modes via the kernel create_table builder. 2/ Materialized partitioned writes (materializePartitionColumns): kernel delegates to the engine's ParquetHandler. The default engine inherits the guarantee from arrow-rs, whose RecordBatch::try_new rejects nulls in fields with nullable: false. The table for this case is set up via the kernel create_table builder with delta.feature.materializePartitionColumns=supported (allow-listed by delta-io#2481). 3/ Plain non-null data columns: same engine-delegation seam, exercised across a representative primitive type matrix (integer, long, string, binary, boolean, timestamp, decimal). The table is created via the kernel create_table builder so the non-null schema drives the auto-enablement of the invariants writer feature end-to-end; the test asserts both the auto-enable and the downstream RecordBatch::try_new rejection. Pins the full chain documented on maybe_enable_invariants in transaction/builder/create_table.rs. Local verification: 1/ cargo +nightly fmt --check 2/ cargo clippy --workspace --benches --tests --all-features -- -D warnings 3/ cargo doc --workspace --all-features --no-deps 4/ cargo test -p delta_kernel --all-features for affected paths
fe9319d to
34b6516
Compare
Collaborator
Author
Range-diff: main (fe9319d -> 34b6516)
Reproduce locally: |
## What changes are proposed in this pull request? Adds TableFeature::MaterializePartitionColumns to ALLOWED_DELTA_FEATURES. The feature is already fully understood by kernel: KernelSupport::Supported, the write path keeps partition columns in data files when the feature is on (Transaction::generate_logical_to_physical and TableConfiguration::physical_write_schema), and the read path is correct (scan reconstructs partition columns from add.partitionValues regardless of whether they are materialized in the file). The remaining gap was the create_table builder allow-list, which rejected delta.feature.materializePartitionColumns=supported at build time. There is no delta.* enablement property for materializePartitionColumns in kernel today (MATERIALIZE_PARTITION_COLUMNS_INFO is EnablementCheck::AlwaysIfSupported), so the only opt-in at create time is the explicit feature signal. ## How was this change tested? 1/ New unit test test_create_table_with_materialize_partition_columns_feature_signal_allowed in kernel/tests/create_table/partitioned.rs. asserts that the feature signal lands in writerFeatures exactly once, does not appear in readerFeatures (writer-only), and is_feature_enabled returns true. 2/ Local verification: - cargo +nightly fmt --check - cargo clippy --workspace --benches --tests --all-features -- -D warnings - cargo doc --workspace --all-features --no-deps - cargo test -p delta_kernel --all-features for affected paths
sanujbasu
added a commit
to sanujbasu/delta-kernel-rs
that referenced
this pull request
Apr 28, 2026
## What changes are proposed in this pull request? Fixes delta-io#2465. Closes the write-time enforcement gap left by delta-io#2418, which auto-enables the invariants writer feature on schemas with non-null columns but does not itself reject nulls on writes. Kernel now rejects Scalar::Null partition values for partition columns with nullable: false in partitioned_write_context, matching Delta-Spark's DELTA_NOT_NULL_CONSTRAINT_VIOLATED (SQLSTATE 23502). The check sits in validate_types alongside the existing type checks. The Scalar::Null inner type continues to be ignored on nulls, so connectors can keep constructing null partition values without first looking up the schema; only the schema field's nullability is enforced. This matches Catalyst's NullType permissiveness and the type-erased on-wire format (partitionValues serializes nulls as JSON null with no type information). ## How was this change tested? Adds integration tests covering all three non-null write paths: 1/ Non-materialized partitioned writes (default): kernel rejects the null Scalar at partitioned_write_context time, before serialization. Covered across all column-mapping modes via the kernel create_table builder. 2/ Materialized partitioned writes (materializePartitionColumns): kernel delegates to the engine's ParquetHandler. The default engine inherits the guarantee from arrow-rs, whose RecordBatch::try_new rejects nulls in fields with nullable: false. The table for this case is set up via the kernel create_table builder with delta.feature.materializePartitionColumns=supported (allow-listed by delta-io#2481). 3/ Plain non-null data columns: same engine-delegation seam, exercised across a representative primitive type matrix (integer, long, string, binary, boolean, timestamp, decimal). The table is created via the kernel create_table builder so the non-null schema drives the auto-enablement of the invariants writer feature end-to-end; the test asserts both the auto-enable and the downstream RecordBatch::try_new rejection. Pins the full chain documented on maybe_enable_invariants in transaction/builder/create_table.rs. Local verification: 1/ cargo +nightly fmt --check 2/ cargo clippy --workspace --benches --tests --all-features -- -D warnings 3/ cargo doc --workspace --all-features --no-deps 4/ cargo test -p delta_kernel --all-features for affected paths
34b6516 to
66b5a42
Compare
Collaborator
Author
Range-diff: main (34b6516 -> 66b5a42)
Reproduce locally: |
rliao147
approved these changes
Apr 28, 2026
sanujbasu
added a commit
to sanujbasu/delta-kernel-rs
that referenced
this pull request
Apr 29, 2026
## What changes are proposed in this pull request? Fixes delta-io#2465. Closes the write-time enforcement gap left by delta-io#2418, which auto-enables the invariants writer feature on schemas with non-null columns but does not itself reject nulls on writes. Kernel now rejects Scalar::Null partition values for partition columns with nullable: false in partitioned_write_context, matching Delta-Spark's DELTA_NOT_NULL_CONSTRAINT_VIOLATED (SQLSTATE 23502). The check sits in validate_types alongside the existing type checks. The Scalar::Null inner type continues to be ignored on nulls, so connectors can keep constructing null partition values without first looking up the schema; only the schema field's nullability is enforced. This matches Catalyst's NullType permissiveness and the type-erased on-wire format (partitionValues serializes nulls as JSON null with no type information). ## How was this change tested? Adds integration tests covering all three non-null write paths: 1/ Non-materialized partitioned writes (default): kernel rejects the null Scalar at partitioned_write_context time, before serialization. Covered across all column-mapping modes via the kernel create_table builder. 2/ Materialized partitioned writes (materializePartitionColumns): kernel delegates to the engine's ParquetHandler. The default engine inherits the guarantee from arrow-rs, whose RecordBatch::try_new rejects nulls in fields with nullable: false. The table for this case is set up via the kernel create_table builder with delta.feature.materializePartitionColumns=supported (allow-listed by delta-io#2481). 3/ Plain non-null data columns: same engine-delegation seam, exercised across a representative primitive type matrix (integer, long, string, binary, boolean, timestamp, decimal). The table is created via the kernel create_table builder so the non-null schema drives the auto-enablement of the invariants writer feature end-to-end; the test asserts both the auto-enable and the downstream RecordBatch::try_new rejection. Pins the full chain documented on maybe_enable_invariants in transaction/builder/create_table.rs. Local verification: 1/ cargo +nightly fmt --check 2/ cargo clippy --workspace --benches --tests --all-features -- -D warnings 3/ cargo doc --workspace --all-features --no-deps 4/ cargo test -p delta_kernel --all-features for affected paths
sanujbasu
added a commit
to sanujbasu/delta-kernel-rs
that referenced
this pull request
Apr 29, 2026
## What changes are proposed in this pull request? Fixes delta-io#2465. Closes the write-time enforcement gap left by delta-io#2418, which auto-enables the invariants writer feature on schemas with non-null columns but does not itself reject nulls on writes. Kernel now rejects Scalar::Null partition values for partition columns with nullable: false in partitioned_write_context, matching Delta-Spark's DELTA_NOT_NULL_CONSTRAINT_VIOLATED (SQLSTATE 23502). The check sits in validate_types alongside the existing type checks. The Scalar::Null inner type continues to be ignored on nulls, so connectors can keep constructing null partition values without first looking up the schema; only the schema field's nullability is enforced. This matches Catalyst's NullType permissiveness and the type-erased on-wire format (partitionValues serializes nulls as JSON null with no type information). ## How was this change tested? Adds integration tests covering all three non-null write paths: 1/ Non-materialized partitioned writes (default): kernel rejects the null Scalar at partitioned_write_context time, before serialization. Covered across all column-mapping modes via the kernel create_table builder. 2/ Materialized partitioned writes (materializePartitionColumns): kernel delegates to the engine's ParquetHandler. The default engine inherits the guarantee from arrow-rs, whose RecordBatch::try_new rejects nulls in fields with nullable: false. The table for this case is set up via the kernel create_table builder with delta.feature.materializePartitionColumns=supported (allow-listed by delta-io#2481). 3/ Plain non-null data columns: same engine-delegation seam, exercised across a representative primitive type matrix (integer, long, string, binary, boolean, timestamp, decimal). The table is created via the kernel create_table builder so the non-null schema drives the auto-enablement of the invariants writer feature end-to-end; the test asserts both the auto-enable and the downstream RecordBatch::try_new rejection. Pins the full chain documented on maybe_enable_invariants in transaction/builder/create_table.rs. Local verification: 1/ cargo +nightly fmt --check 2/ cargo clippy --workspace --benches --tests --all-features -- -D warnings 3/ cargo doc --workspace --all-features --no-deps 4/ cargo test -p delta_kernel --all-features for affected paths
sanujbasu
added a commit
to sanujbasu/delta-kernel-rs
that referenced
this pull request
Apr 30, 2026
## What changes are proposed in this pull request? Fixes delta-io#2465. Closes the write-time enforcement gap left by delta-io#2418, which auto-enables the invariants writer feature on schemas with non-null columns but does not itself reject nulls on writes. Kernel now rejects Scalar::Null partition values for partition columns with nullable: false in partitioned_write_context, matching Delta-Spark's DELTA_NOT_NULL_CONSTRAINT_VIOLATED (SQLSTATE 23502). The check sits in validate_types alongside the existing type checks. The Scalar::Null inner type continues to be ignored on nulls, so connectors can keep constructing null partition values without first looking up the schema; only the schema field's nullability is enforced. This matches Catalyst's NullType permissiveness and the type-erased on-wire format (partitionValues serializes nulls as JSON null with no type information). ## How was this change tested? Adds integration tests covering all three non-null write paths: 1/ Non-materialized partitioned writes (default): kernel rejects the null Scalar at partitioned_write_context time, before serialization. Covered across all column-mapping modes via the kernel create_table builder. 2/ Materialized partitioned writes (materializePartitionColumns): kernel delegates to the engine's ParquetHandler. The default engine inherits the guarantee from arrow-rs, whose RecordBatch::try_new rejects nulls in fields with nullable: false. The table for this case is set up via the kernel create_table builder with delta.feature.materializePartitionColumns=supported (allow-listed by delta-io#2481). 3/ Plain non-null data columns: same engine-delegation seam, exercised across a representative primitive type matrix (integer, long, string, binary, boolean, timestamp, decimal). The table is created via the kernel create_table builder so the non-null schema drives the auto-enablement of the invariants writer feature end-to-end; the test asserts both the auto-enable and the downstream RecordBatch::try_new rejection. Pins the full chain documented on maybe_enable_invariants in transaction/builder/create_table.rs. Local verification: 1/ cargo +nightly fmt --check 2/ cargo clippy --workspace --benches --tests --all-features -- -D warnings 3/ cargo doc --workspace --all-features --no-deps 4/ cargo test -p delta_kernel --all-features for affected paths
sanujbasu
added a commit
to sanujbasu/delta-kernel-rs
that referenced
this pull request
May 2, 2026
Fixes delta-io#2465. Closes the write-time enforcement gap left by delta-io#2418, which auto-enables the invariants writer feature on schemas with non-null columns but does not itself reject nulls on writes. Kernel now rejects Scalar::Null partition values for partition columns with nullable: false in partitioned_write_context, matching Delta-Spark's DELTA_NOT_NULL_CONSTRAINT_VIOLATED (SQLSTATE 23502). The check sits in validate_types alongside the existing type checks. The Scalar::Null inner type continues to be ignored on nulls, so connectors can keep constructing null partition values without first looking up the schema; only the schema field's nullability is enforced. This matches Catalyst's NullType permissiveness and the type-erased on-wire format (partitionValues serializes nulls as JSON null with no type information). Adds integration tests covering all three non-null write paths: 1/ Non-materialized partitioned writes (default): kernel rejects the null Scalar at partitioned_write_context time, before serialization. Covered across all column-mapping modes via the kernel create_table builder. 2/ Materialized partitioned writes (materializePartitionColumns): kernel delegates to the engine's ParquetHandler. The default engine inherits the guarantee from arrow-rs, whose RecordBatch::try_new rejects nulls in fields with nullable: false. The table for this case is set up via the kernel create_table builder with delta.feature.materializePartitionColumns=supported (allow-listed by delta-io#2481). 3/ Plain non-null data columns: same engine-delegation seam, exercised across a representative primitive type matrix (integer, long, string, binary, boolean, timestamp, decimal). The table is created via the kernel create_table builder so the non-null schema drives the auto-enablement of the invariants writer feature end-to-end; the test asserts both the auto-enable and the downstream RecordBatch::try_new rejection. Pins the full chain documented on maybe_enable_invariants in transaction/builder/create_table.rs. Local verification: 1/ cargo +nightly fmt --check 2/ cargo clippy --workspace --benches --tests --all-features -- -D warnings 3/ cargo doc --workspace --all-features --no-deps 4/ cargo test -p delta_kernel --all-features for affected paths
sanujbasu
added a commit
to sanujbasu/delta-kernel-rs
that referenced
this pull request
May 2, 2026
Fixes delta-io#2465. Closes the write-time enforcement gap left by delta-io#2418, which auto-enables the invariants writer feature on schemas with non-null columns but does not itself reject nulls on writes. Kernel now rejects Scalar::Null partition values for partition columns with nullable: false in partitioned_write_context, matching Delta-Spark's DELTA_NOT_NULL_CONSTRAINT_VIOLATED (SQLSTATE 23502). The check sits in validate_types alongside the existing type checks. The Scalar::Null inner type continues to be ignored on nulls, so connectors can keep constructing null partition values without first looking up the schema; only the schema field's nullability is enforced. This matches Catalyst's NullType permissiveness and the type-erased on-wire format (partitionValues serializes nulls as JSON null with no type information). Adds integration tests covering all three non-null write paths: 1/ Non-materialized partitioned writes (default): kernel rejects the null Scalar at partitioned_write_context time, before serialization. Covered across all column-mapping modes via the kernel create_table builder. 2/ Materialized partitioned writes (materializePartitionColumns): kernel delegates to the engine's ParquetHandler. The default engine inherits the guarantee from arrow-rs, whose RecordBatch::try_new rejects nulls in fields with nullable: false. The table for this case is set up via the kernel create_table builder with delta.feature.materializePartitionColumns=supported (allow-listed by delta-io#2481). 3/ Plain non-null data columns: same engine-delegation seam, exercised across a representative primitive type matrix (integer, long, string, binary, boolean, timestamp, decimal). The table is created via the kernel create_table builder so the non-null schema drives the auto-enablement of the invariants writer feature end-to-end; the test asserts both the auto-enable and the downstream RecordBatch::try_new rejection. Pins the full chain documented on maybe_enable_invariants in transaction/builder/create_table.rs. Local verification: 1/ cargo +nightly fmt --check 2/ cargo clippy --workspace --benches --tests --all-features -- -D warnings 3/ cargo doc --workspace --all-features --no-deps 4/ cargo test -p delta_kernel --all-features for affected paths
CynicDog
pushed a commit
to CynicDog/delta-kernel-rs
that referenced
this pull request
May 2, 2026
…2483) ## What changes are proposed in this pull request? Fixes delta-io#2465. Closes the write-time enforcement gap left by delta-io#2418, which auto-enables the invariants writer feature on schemas with non-null columns but does not itself reject nulls on writes. Kernel now rejects Scalar::Null partition values for partition columns with nullable: false in partitioned_write_context, matching Delta-Spark's DELTA_NOT_NULL_CONSTRAINT_VIOLATED (SQLSTATE 23502). The check sits in validate_types alongside the existing type checks. The Scalar::Null inner type continues to be ignored on nulls, so connectors can keep constructing null partition values without first looking up the schema; only the schema field's nullability is enforced. This matches Catalyst's NullType permissiveness and the type-erased on-wire format (partitionValues serializes nulls as JSON null with no type information). ## How was this change tested? Adds integration tests covering all three non-null write paths: 1/ Non-materialized partitioned writes (default): kernel rejects the null Scalar at partitioned_write_context time, before serialization. Covered across all column-mapping modes via the kernel create_table builder. 2/ Materialized partitioned writes (materializePartitionColumns): kernel delegates to the engine's ParquetHandler. The default engine inherits the guarantee from arrow-rs, whose RecordBatch::try_new rejects nulls in fields with nullable: false. The table for this case is set up via the kernel create_table builder with delta.feature.materializePartitionColumns=supported (allow-listed by delta-io#2481). 3/ Plain non-null data columns: same engine-delegation seam, exercised across a representative primitive type matrix (integer, long, string, binary, boolean, timestamp, decimal). The table is created via the kernel create_table builder so the non-null schema drives the auto-enablement of the invariants writer feature end-to-end; the test asserts both the auto-enable and the downstream RecordBatch::try_new rejection. Pins the full chain documented on maybe_enable_invariants in transaction/builder/create_table.rs. Local verification: 1/ cargo +nightly fmt --check 2/ cargo clippy --workspace --benches --tests --all-features -- -D warnings 3/ cargo doc --workspace --all-features --no-deps 4/ cargo test -p delta_kernel --all-features for affected paths Co-authored-by: Sanuj Basu <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changes are proposed in this pull request?
Adds TableFeature::MaterializePartitionColumns to ALLOWED_DELTA_FEATURES.
The feature is already fully understood by kernel: KernelSupport::Supported, the write path keeps
partition columns in data files when the feature is on (Transaction::generate_logical_to_physical and TableConfiguration::physical_write_schema), and the read path is correct (scan reconstructs partition columns
from add.partitionValues regardless of whether they are materialized in the file).
The remaining gap was the create_table builder allow-list, which rejected delta.feature.materializePartitionColumns=supported at build time.
There is no delta.* enablement property for materializePartitionColumns in kernel today (MATERIALIZE_PARTITION_COLUMNS_INFO is EnablementCheck::AlwaysIfSupported), so the
only opt-in at create time is the explicit feature signal.
How was this change tested?
1/ New unit test test_create_table_with_materialize_partition_columns_feature_signal_allowed in kernel/tests/create_table/partitioned.rs. asserts that the feature signal lands in writerFeatures exactly once, does not appear in readerFeatures (writer-only), and is_feature_enabled returns true.
2/ Local verification: