Skip to content

Commit 2410564

Browse files
committed
Merge remote-tracking branch 'upstream/main' into feat/rustls-reqwest
2 parents 927b336 + be93add commit 2410564

File tree

8 files changed

+149
-159
lines changed

8 files changed

+149
-159
lines changed

CHANGELOG.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,33 @@
11
# Changelog
22

3+
## [v0.18.1](https://github.com/delta-io/delta-kernel-rs/tree/v0.18.1/) (2025-11-24)
4+
5+
[Full Changelog](https://github.com/delta-io/delta-kernel-rs/compare/v0.18.0...v0.18.1)
6+
7+
8+
### 🚀 Features / new APIs
9+
10+
1. Scan::execute no longer requires lifetime bound ([#1515])
11+
2. Migrate protocol validation to table_configuration ([#1411])
12+
3. Add Display for StructType, StructField, and MetadataColumnSpec ([#1494])
13+
5. Add EngineDataArrowExt and use it everywhere ([#1516])
14+
6. Implement builder for StructType ([#1492])
15+
7. Enable CDF for column-mapped tables ([#1510])
16+
17+
### 🧪 Testing
18+
19+
1. Extract File Action tests ([#1365])
20+
21+
22+
[#1515]: https://github.com/delta-io/delta-kernel-rs/pull/1515
23+
[#1365]: https://github.com/delta-io/delta-kernel-rs/pull/1365
24+
[#1411]: https://github.com/delta-io/delta-kernel-rs/pull/1411
25+
[#1494]: https://github.com/delta-io/delta-kernel-rs/pull/1494
26+
[#1516]: https://github.com/delta-io/delta-kernel-rs/pull/1516
27+
[#1492]: https://github.com/delta-io/delta-kernel-rs/pull/1492
28+
[#1510]: https://github.com/delta-io/delta-kernel-rs/pull/1510
29+
30+
331
## [v0.18.0](https://github.com/delta-io/delta-kernel-rs/tree/v0.18.0/) (2025-11-19)
432

533
[Full Changelog](https://github.com/delta-io/delta-kernel-rs/compare/v0.17.1...v0.18.0)

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,4 @@ license = "Apache-2.0"
2727
repository = "https://github.com/delta-io/delta-kernel-rs"
2828
readme = "README.md"
2929
rust-version = "1.85"
30-
version = "0.18.0"
30+
version = "0.18.1"

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ consumer's own `Engine` trait, the kernel has a feature flag to enable a default
5252
```toml
5353
# fewer dependencies, requires consumer to implement Engine trait.
5454
# allows consumers to implement their own in-memory format
55-
delta_kernel = "0.18.0"
55+
delta_kernel = "0.18.1"
5656

5757
# or turn on the default engine, based on latest arrow
58-
delta_kernel = { version = "0.18.0", features = ["default-engine", "arrow"] }
58+
delta_kernel = { version = "0.18.1", features = ["default-engine", "arrow"] }
5959
```
6060

6161
### Feature flags

ffi/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ url = "2"
2525
delta_kernel = { path = "../kernel", default-features = false, features = [
2626
"internal-api",
2727
] }
28-
delta_kernel_ffi_macros = { path = "../ffi-proc-macros", version = "0.18.0" }
28+
delta_kernel_ffi_macros = { path = "../ffi-proc-macros", version = "0.18.1" }
2929

3030
[build-dependencies]
3131
cbindgen = "0.29.2"

kernel/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ pre-release-hook = [
3939
]
4040

4141
[dependencies]
42-
delta_kernel_derive = { path = "../derive-macros", version = "0.18.0" }
42+
delta_kernel_derive = { path = "../derive-macros", version = "0.18.1" }
4343
bytes = "1.10"
4444
chrono = "0.4.41"
4545
crc = "3.2.2"

kernel/src/actions/mod.rs

Lines changed: 0 additions & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -1477,135 +1477,6 @@ mod tests {
14771477
}
14781478
}
14791479

1480-
use crate::table_configuration::TableConfiguration;
1481-
use crate::utils::test_utils::assert_result_error_with_message;
1482-
1483-
// TODO: Migrate these protocol validation tests to TableConfiguration.
1484-
// The ensure_read_supported and ensure_write_supported methods have been moved from Protocol
1485-
// to TableConfiguration. These tests should be refactored to use TableConfiguration instead.
1486-
1487-
// Helper to create a TableConfiguration for testing protocol validation
1488-
fn create_table_config_for_protocol(protocol: Protocol) -> DeltaResult<TableConfiguration> {
1489-
let schema = StructType::new_unchecked([StructField::nullable("value", DataType::INTEGER)]);
1490-
let metadata = Metadata::try_new(None, None, schema, vec![], 0, HashMap::new())?;
1491-
let table_root = url::Url::parse("file:///tmp/test").unwrap();
1492-
TableConfiguration::try_new(metadata, protocol, table_root, 0)
1493-
}
1494-
1495-
#[test]
1496-
fn test_v2_checkpoint_supported() {
1497-
let protocol = Protocol::try_new(
1498-
3,
1499-
7,
1500-
Some([TableFeature::V2Checkpoint]),
1501-
Some([TableFeature::V2Checkpoint]),
1502-
)
1503-
.unwrap();
1504-
assert!(create_table_config_for_protocol(protocol).is_ok());
1505-
}
1506-
1507-
#[test]
1508-
fn test_ensure_read_supported() {
1509-
let protocol = Protocol {
1510-
min_reader_version: 3,
1511-
min_writer_version: 7,
1512-
reader_features: Some(vec![]),
1513-
writer_features: Some(vec![]),
1514-
};
1515-
assert!(create_table_config_for_protocol(protocol).is_ok());
1516-
1517-
let protocol = Protocol::try_new(
1518-
3,
1519-
7,
1520-
Some([TableFeature::V2Checkpoint]),
1521-
Some([TableFeature::V2Checkpoint]),
1522-
)
1523-
.unwrap();
1524-
assert!(create_table_config_for_protocol(protocol).is_ok());
1525-
1526-
let protocol = Protocol {
1527-
min_reader_version: 1,
1528-
min_writer_version: 7,
1529-
reader_features: None,
1530-
writer_features: None,
1531-
};
1532-
assert!(create_table_config_for_protocol(protocol).is_ok());
1533-
1534-
let protocol = Protocol {
1535-
min_reader_version: 2,
1536-
min_writer_version: 7,
1537-
reader_features: None,
1538-
writer_features: None,
1539-
};
1540-
assert!(create_table_config_for_protocol(protocol).is_ok());
1541-
}
1542-
1543-
#[test]
1544-
fn test_ensure_write_supported() {
1545-
let protocol = Protocol::try_new(
1546-
3,
1547-
7,
1548-
Some(vec![TableFeature::DeletionVectors]),
1549-
Some(vec![
1550-
TableFeature::AppendOnly,
1551-
TableFeature::DeletionVectors,
1552-
TableFeature::DomainMetadata,
1553-
TableFeature::Invariants,
1554-
TableFeature::RowTracking,
1555-
]),
1556-
)
1557-
.unwrap();
1558-
let config = create_table_config_for_protocol(protocol).unwrap();
1559-
assert!(config.ensure_write_supported().is_ok());
1560-
1561-
// Verify that unsupported reader features are rejected (TypeWidening is a ReaderWriter feature not supported for writes)
1562-
let protocol = Protocol::try_new(
1563-
3,
1564-
7,
1565-
Some([TableFeature::TypeWidening]),
1566-
Some([TableFeature::TypeWidening]),
1567-
)
1568-
.unwrap();
1569-
let config = create_table_config_for_protocol(protocol).unwrap();
1570-
assert_result_error_with_message(
1571-
config.ensure_write_supported(),
1572-
r#"Feature 'typeWidening' not supported for writes"#,
1573-
);
1574-
1575-
// Unknown writer features are allowed during Protocol creation for forward compatibility,
1576-
// but will fail when trying to create TableConfiguration (reads not supported)
1577-
let protocol = Protocol::try_new(
1578-
3,
1579-
7,
1580-
Some([TableFeature::Unknown("unsupported feature".to_string())]),
1581-
Some([TableFeature::Unknown("unsupported feature".to_string())]),
1582-
)
1583-
.unwrap();
1584-
assert_result_error_with_message(
1585-
create_table_config_for_protocol(protocol),
1586-
r#"Unsupported: Unknown feature 'unsupported feature'"#,
1587-
);
1588-
}
1589-
1590-
#[test]
1591-
fn test_illegal_writer_feature_combination() {
1592-
let protocol = Protocol::try_new(
1593-
3,
1594-
7,
1595-
Some::<Vec<String>>(vec![]),
1596-
Some(vec![
1597-
// No domain metadata even though that is required
1598-
TableFeature::RowTracking,
1599-
]),
1600-
)
1601-
.unwrap();
1602-
let config = create_table_config_for_protocol(protocol).unwrap();
1603-
assert_result_error_with_message(
1604-
config.ensure_write_supported(),
1605-
"rowTracking requires domainMetadata to be supported",
1606-
);
1607-
}
1608-
16091480
#[test]
16101481
fn test_ensure_supported_features() {
16111482
let supported_features = [TableFeature::ColumnMapping, TableFeature::DeletionVectors];
@@ -1636,30 +1507,6 @@ mod tests {
16361507
assert_eq!(parse_features::<TableFeature>(features), expected);
16371508
}
16381509

1639-
#[cfg(feature = "catalog-managed")]
1640-
#[test]
1641-
fn test_catalog_managed_writes() {
1642-
let protocol = Protocol::try_new(
1643-
3,
1644-
7,
1645-
Some([TableFeature::CatalogManaged]),
1646-
Some([TableFeature::CatalogManaged]),
1647-
)
1648-
.unwrap();
1649-
let config = create_table_config_for_protocol(protocol).unwrap();
1650-
assert!(config.ensure_write_supported().is_ok());
1651-
1652-
let protocol = Protocol::try_new(
1653-
3,
1654-
7,
1655-
Some([TableFeature::CatalogOwnedPreview]),
1656-
Some([TableFeature::CatalogOwnedPreview]),
1657-
)
1658-
.unwrap();
1659-
let config = create_table_config_for_protocol(protocol).unwrap();
1660-
assert!(config.ensure_write_supported().is_ok());
1661-
}
1662-
16631510
#[test]
16641511
fn test_into_engine_data() {
16651512
let engine = ExprEngine::new();

kernel/src/engine/ensure_data_types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ mod tests {
352352
&incorrect_variant_arrow_type(),
353353
true,
354354
),
355-
"Invalid argument error: Incorrect datatype. Expected Struct(\"metadata\": Binary, \"value\": Binary), got Struct(\"field_1\": nullable Binary, \"field_2\": nullable Binary)",
355+
"Invalid argument error: Incorrect datatype",
356356
)
357357
}
358358

kernel/src/table_configuration.rs

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1424,4 +1424,119 @@ mod test {
14241424
assert!(!config.is_feature_info_supported(&feature, &custom_feature_info));
14251425
assert!(!config.is_feature_info_enabled(&feature, &custom_feature_info));
14261426
}
1427+
1428+
#[test]
1429+
fn test_v2_checkpoint_supported() {
1430+
let config = create_mock_table_config(&[], &[TableFeature::V2Checkpoint]);
1431+
assert!(config.is_v2_checkpoint_write_supported());
1432+
}
1433+
1434+
#[test]
1435+
fn test_ensure_read_supported() {
1436+
let config = create_mock_table_config(&[], &[]);
1437+
assert!(config.ensure_read_supported().is_ok());
1438+
1439+
let config = create_mock_table_config(&[], &[TableFeature::V2Checkpoint]);
1440+
assert!(config.ensure_read_supported().is_ok());
1441+
1442+
let config = create_mock_table_config_with_version(&[], None, 1, 2);
1443+
assert!(config.ensure_read_supported().is_ok());
1444+
1445+
let config = create_mock_table_config_with_version(
1446+
&[],
1447+
Some(&[TableFeature::InCommitTimestamp]),
1448+
2,
1449+
7,
1450+
);
1451+
assert!(config.ensure_read_supported().is_ok());
1452+
}
1453+
1454+
#[test]
1455+
fn test_ensure_write_supported() {
1456+
let config = create_mock_table_config(
1457+
&[],
1458+
&[
1459+
TableFeature::AppendOnly,
1460+
TableFeature::DeletionVectors,
1461+
TableFeature::DomainMetadata,
1462+
TableFeature::Invariants,
1463+
TableFeature::RowTracking,
1464+
],
1465+
);
1466+
assert!(config.ensure_write_supported().is_ok());
1467+
1468+
// Type Widening is not supported for writes
1469+
let config = create_mock_table_config(&[], &[TableFeature::TypeWidening]);
1470+
assert_result_error_with_message(
1471+
config.ensure_write_supported(),
1472+
r#"Feature 'typeWidening' not supported for writes"#,
1473+
);
1474+
1475+
// Unknown feature is not supported for reads
1476+
let schema = StructType::new_unchecked([StructField::nullable("value", DataType::INTEGER)]);
1477+
let metadata = Metadata::try_new(None, None, schema, vec![], 0, HashMap::new()).unwrap();
1478+
let protocol = Protocol::try_new(
1479+
3,
1480+
7,
1481+
Some([TableFeature::Unknown("unsupported feature".to_string())]),
1482+
Some([TableFeature::Unknown("unsupported feature".to_string())]),
1483+
)
1484+
.unwrap();
1485+
let table_root = Url::try_from("file:///").unwrap();
1486+
assert_result_error_with_message(
1487+
TableConfiguration::try_new(metadata, protocol, table_root, 0),
1488+
r#"Unsupported: Unknown feature 'unsupported feature'"#,
1489+
);
1490+
}
1491+
1492+
#[test]
1493+
fn test_illegal_writer_feature_combination() {
1494+
let schema = StructType::new_unchecked([StructField::nullable("value", DataType::INTEGER)]);
1495+
let metadata = Metadata::try_new(None, None, schema, vec![], 0, HashMap::new()).unwrap();
1496+
let protocol = Protocol::try_new(
1497+
3,
1498+
7,
1499+
Some::<Vec<String>>(vec![]),
1500+
Some(vec![TableFeature::RowTracking]),
1501+
)
1502+
.unwrap();
1503+
let table_root = Url::try_from("file:///").unwrap();
1504+
let config = TableConfiguration::try_new(metadata, protocol, table_root, 0).unwrap();
1505+
assert_result_error_with_message(
1506+
config.ensure_write_supported(),
1507+
"rowTracking requires domainMetadata to be supported",
1508+
);
1509+
}
1510+
1511+
#[test]
1512+
fn test_row_tracking_with_domain_metadata_requirement() {
1513+
let schema = StructType::new_unchecked([StructField::nullable("value", DataType::INTEGER)]);
1514+
let metadata = Metadata::try_new(None, None, schema, vec![], 0, HashMap::new()).unwrap();
1515+
let protocol = Protocol::try_new(
1516+
3,
1517+
7,
1518+
Some::<Vec<String>>(vec![]),
1519+
Some(vec![
1520+
TableFeature::RowTracking,
1521+
TableFeature::DomainMetadata,
1522+
]),
1523+
)
1524+
.unwrap();
1525+
let table_root = Url::try_from("file:///").unwrap();
1526+
let config = TableConfiguration::try_new(metadata, protocol, table_root, 0).unwrap();
1527+
assert!(
1528+
config.ensure_write_supported().is_ok(),
1529+
"RowTracking with DomainMetadata should be supported for writes"
1530+
);
1531+
}
1532+
1533+
#[cfg(feature = "catalog-managed")]
1534+
#[test]
1535+
fn test_catalog_managed_writes() {
1536+
let config = create_mock_table_config(&[], &[TableFeature::CatalogManaged]);
1537+
assert!(config.ensure_write_supported().is_ok());
1538+
1539+
let config = create_mock_table_config(&[], &[TableFeature::CatalogOwnedPreview]);
1540+
assert!(config.ensure_write_supported().is_ok());
1541+
}
14271542
}

0 commit comments

Comments
 (0)