From 7325da7a0aefc14a85d9abb12963811d39b5b0f4 Mon Sep 17 00:00:00 2001 From: Kevin Liu Date: Mon, 23 Mar 2026 12:11:19 -0700 Subject: [PATCH 01/23] fix: explicitly set Python interpreter in maturin build to prevent using wrong version (#2277) (cherry picked from commit 4c08d35cdc337d2428bb9ef4e14c0ed12caaec35) --- .github/workflows/bindings_python_ci.yml | 6 +++--- .github/workflows/release_python.yml | 2 +- .github/workflows/release_python_nightly.yml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/bindings_python_ci.yml b/.github/workflows/bindings_python_ci.yml index 78e1a9615c..efd4a78098 100644 --- a/.github/workflows/bindings_python_ci.yml +++ b/.github/workflows/bindings_python_ci.yml @@ -59,7 +59,7 @@ jobs: runs-on: ubuntu-slim steps: - uses: actions/checkout@v6 - - uses: astral-sh/setup-uv@v7 + - uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 with: version: "0.9.3" enable-cache: true @@ -93,8 +93,8 @@ jobs: with: working-directory: "bindings/python" command: build - args: --out dist - - uses: astral-sh/setup-uv@v7 + args: --out dist -i python3.12 # Explicitly set interpreter; manylinux containers have multiple Pythons and maturin may pick an older one + - uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 with: version: "0.9.3" enable-cache: true diff --git a/.github/workflows/release_python.yml b/.github/workflows/release_python.yml index 5d97e23a2e..abf8b52b6d 100644 --- a/.github/workflows/release_python.yml +++ b/.github/workflows/release_python.yml @@ -191,7 +191,7 @@ jobs: manylinux: ${{ matrix.manylinux || 'auto' }} working-directory: "bindings/python" command: build - args: --release -o dist + args: --release -o dist -i python3.12 # Explicitly set interpreter; manylinux containers have multiple Pythons and maturin may pick an older one - name: Upload wheels uses: actions/upload-artifact@v7 with: diff --git a/.github/workflows/release_python_nightly.yml b/.github/workflows/release_python_nightly.yml index 6f9655e29c..595cb42d05 100644 --- a/.github/workflows/release_python_nightly.yml +++ b/.github/workflows/release_python_nightly.yml @@ -101,7 +101,7 @@ jobs: manylinux: ${{ matrix.manylinux || 'auto' }} working-directory: "bindings/python" command: build - args: --release -o dist + args: --release -o dist -i python3.12 # Explicitly set interpreter; manylinux containers have multiple Pythons and maturin may pick an older one - name: Upload wheels uses: actions/upload-artifact@v7 From 65bb709850960a2fa13f2b125eb07516c2b1948a Mon Sep 17 00:00:00 2001 From: Matt Butrovich Date: Wed, 15 Apr 2026 21:30:40 -0400 Subject: [PATCH 02/23] fix: build_fallback_field_id_map produces incorrect column indices for schemas with nested types (#2307) ## Which issue does this PR close? - Closes #2306. - Downstream issue: https://github.com/apache/datafusion-comet/issues/3860 ## What changes are included in this PR? `build_fallback_field_id_map` iterated over Parquet leaf columns instead of top-level fields when building the field ID to column index mapping for migrated files (no embedded field IDs). When nested types (struct, list, map) precede a primitive column, they expand into multiple leaves, causing the mapping to diverge from `add_fallback_field_ids_to_arrow_schema` which correctly assigns ordinal IDs to top-level Arrow fields. This made predicates on columns after nested types resolve to a leaf inside the group, crashing with "Leaf column `id` in predicates isn't a root column in Parquet schema". The fix iterates `root_schema().get_fields()` directly, assigning ordinal IDs only to top-level fields. For non-primitive fields (struct/list/map), it uses `get_column_root_idx` to advance past their leaf columns. This mirrors iceberg-java's `ParquetSchemaUtil.addFallbackIds()`, which iterates `fileSchema.getFields()` assigning ordinal IDs to top-level fields. Also renames "Leave column" to "Leaf column" in error messages. ## Are these changes tested? - An integration test (`test_predicate_on_migrated_file_with_nested_types`) writes a Parquet file without field IDs containing struct, list, and map columns before an `id` column, then reads with a predicate on `id`. This reproduces the exact crash before the fix. Test data is constructed with `serde_arrow` for readability. - [Apache DataFusion Comet](https://github.com/apache/datafusion-comet) used the repro test in [apache/datafusion-comet#3860](https://github.com/apache/datafusion-comet/issues/3860) and it passes with this change: https://github.com/apache/datafusion-comet/pull/3872 --------- Co-authored-by: blackmwk (cherry picked from commit 5ea6f4cfed6477a1b423a7513de02a4ff686a2fa) --- Cargo.lock | 46 ++++++ crates/iceberg/Cargo.toml | 1 + crates/iceberg/src/arrow/reader.rs | 238 ++++++++++++++++++++++++++++- 3 files changed, 277 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 43b46822cf..23b5bf92e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1085,6 +1085,20 @@ name = "bytemuck" version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "byteorder" @@ -3007,6 +3021,7 @@ version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ + "bytemuck", "cfg-if", "crunchy", "num-traits", @@ -3350,6 +3365,7 @@ dependencies = [ "reqwest", "roaring", "serde", + "serde_arrow", "serde_bytes", "serde_derive", "serde_json", @@ -4115,6 +4131,21 @@ dependencies = [ "twox-hash", ] +[[package]] +name = "marrow" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5240d6977234968ff9ad254bfa73aa397fb51e41dcb22b1eb85835e9295485b" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "bytemuck", + "half", + "serde", +] + [[package]] name = "md-5" version = "0.10.6" @@ -5825,6 +5856,21 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_arrow" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2784e59a0315568e850cb01ddadf458f8c09e28d8cfc4880c2cc08f5dc3444e0" +dependencies = [ + "arrow-array", + "arrow-schema", + "bytemuck", + "chrono", + "half", + "marrow", + "serde", +] + [[package]] name = "serde_bytes" version = "0.11.19" diff --git a/crates/iceberg/Cargo.toml b/crates/iceberg/Cargo.toml index 41ee771617..b8e19472cd 100644 --- a/crates/iceberg/Cargo.toml +++ b/crates/iceberg/Cargo.toml @@ -89,6 +89,7 @@ rand = { workspace = true } regex = { workspace = true } tempfile = { workspace = true } minijinja = { workspace = true } +serde_arrow = { version = "0.14", features = ["arrow-58"] } [package.metadata.cargo-machete] # These dependencies are added to ensure minimal dependency version diff --git a/crates/iceberg/src/arrow/reader.rs b/crates/iceberg/src/arrow/reader.rs index 1de006de74..759ef073c4 100644 --- a/crates/iceberg/src/arrow/reader.rs +++ b/crates/iceberg/src/arrow/reader.rs @@ -1100,7 +1100,7 @@ fn build_field_id_map(parquet_schema: &SchemaDescriptor) -> Result Result usize { + if ty.is_primitive() { + 1 + } else { + ty.get_fields().iter().map(|f| leaf_count(f)).sum() + } +} + +/// Builds a mapping from fallback field IDs to leaf column indices for Parquet files +/// without embedded field IDs. Returns entries only for primitive top-level fields. +/// +/// Must use top-level field positions (not leaf column positions) to stay consistent +/// with `add_fallback_field_ids_to_arrow_schema`, which assigns ordinal IDs to +/// top-level Arrow fields. Using leaf positions instead would produce wrong indices +/// when nested types (struct/list/map) expand into multiple leaf columns. +/// +/// Mirrors iceberg-java's ParquetSchemaUtil.addFallbackIds() which iterates +/// fileSchema.getFields() assigning ordinal IDs to top-level fields. fn build_fallback_field_id_map(parquet_schema: &SchemaDescriptor) -> HashMap { let mut column_map = HashMap::new(); + let mut leaf_idx = 0; - // 1-indexed to match iceberg-java's convention - for (idx, _field) in parquet_schema.columns().iter().enumerate() { - let field_id = (idx + 1) as i32; - column_map.insert(field_id, idx); + for (top_pos, field) in parquet_schema.root_schema().get_fields().iter().enumerate() { + let field_id = (top_pos + 1) as i32; + if field.is_primitive() { + column_map.insert(field_id, leaf_idx); + } + leaf_idx += leaf_count(field); } column_map @@ -1409,7 +1431,7 @@ impl PredicateConverter<'_> { return Err(Error::new( ErrorKind::DataInvalid, format!( - "Leave column `{}` in predicates isn't a root column in Parquet schema.", + "Leaf column `{}` in predicates isn't a root column in Parquet schema.", reference.field().name ), )); @@ -1423,7 +1445,7 @@ impl PredicateConverter<'_> { .ok_or(Error::new( ErrorKind::DataInvalid, format!( - "Leave column `{}` in predicates cannot be found in the required column indices.", + "Leaf column `{}` in predicates cannot be found in the required column indices.", reference.field().name ), ))?; @@ -4667,4 +4689,204 @@ message schema { assert_eq!(result[1], expected_1); assert_eq!(result[2], expected_2); } + + /// Regression for : + /// predicate on a column after nested types in a migrated file (no field IDs). + /// Schema has struct, list, and map columns before the predicate target (`id`), + /// exercising the fallback field ID mapping across all nested type variants. + #[tokio::test] + async fn test_predicate_on_migrated_file_with_nested_types() { + use serde::{Deserialize, Serialize}; + use serde_arrow::schema::{SchemaLike, TracingOptions}; + + #[derive(Serialize, Deserialize)] + struct Person { + name: String, + age: i32, + } + + #[derive(Serialize, Deserialize)] + struct Row { + person: Person, + people: Vec, + props: std::collections::BTreeMap, + id: i32, + } + + let rows = vec![ + Row { + person: Person { + name: "Alice".into(), + age: 30, + }, + people: vec![Person { + name: "Alice".into(), + age: 30, + }], + props: [("k1".into(), "v1".into())].into(), + id: 1, + }, + Row { + person: Person { + name: "Bob".into(), + age: 25, + }, + people: vec![Person { + name: "Bob".into(), + age: 25, + }], + props: [("k2".into(), "v2".into())].into(), + id: 2, + }, + Row { + person: Person { + name: "Carol".into(), + age: 40, + }, + people: vec![Person { + name: "Carol".into(), + age: 40, + }], + props: [("k3".into(), "v3".into())].into(), + id: 3, + }, + ]; + + let tracing_options = TracingOptions::default() + .map_as_struct(false) + .strings_as_large_utf8(false) + .sequence_as_large_list(false); + let fields = Vec::::from_type::(tracing_options).unwrap(); + let arrow_schema = Arc::new(ArrowSchema::new(fields.clone())); + let batch = serde_arrow::to_record_batch(&fields, &rows).unwrap(); + + // Fallback field IDs: person=1, people=2, props=3, id=4 + let iceberg_schema = Arc::new( + Schema::builder() + .with_schema_id(1) + .with_fields(vec![ + NestedField::required( + 1, + "person", + Type::Struct(crate::spec::StructType::new(vec![ + NestedField::required( + 5, + "name", + Type::Primitive(PrimitiveType::String), + ) + .into(), + NestedField::required(6, "age", Type::Primitive(PrimitiveType::Int)) + .into(), + ])), + ) + .into(), + NestedField::required( + 2, + "people", + Type::List(crate::spec::ListType { + element_field: NestedField::required( + 7, + "element", + Type::Struct(crate::spec::StructType::new(vec![ + NestedField::required( + 8, + "name", + Type::Primitive(PrimitiveType::String), + ) + .into(), + NestedField::required( + 9, + "age", + Type::Primitive(PrimitiveType::Int), + ) + .into(), + ])), + ) + .into(), + }), + ) + .into(), + NestedField::required( + 3, + "props", + Type::Map(crate::spec::MapType { + key_field: NestedField::required( + 10, + "key", + Type::Primitive(PrimitiveType::String), + ) + .into(), + value_field: NestedField::required( + 11, + "value", + Type::Primitive(PrimitiveType::String), + ) + .into(), + }), + ) + .into(), + NestedField::required(4, "id", Type::Primitive(PrimitiveType::Int)).into(), + ]) + .build() + .unwrap(), + ); + + let tmp_dir = TempDir::new().unwrap(); + let table_location = tmp_dir.path().to_str().unwrap().to_string(); + let file_path = format!("{table_location}/1.parquet"); + + let props = WriterProperties::builder() + .set_compression(Compression::SNAPPY) + .build(); + let file = File::create(&file_path).unwrap(); + let mut writer = ArrowWriter::try_new(file, arrow_schema, Some(props)).unwrap(); + writer.write(&batch).expect("Writing batch"); + writer.close().unwrap(); + + let predicate = Reference::new("id").greater_than(Datum::int(1)); + + let reader = ArrowReaderBuilder::new(FileIO::new_with_fs()) + .with_row_group_filtering_enabled(true) + .with_row_selection_enabled(true) + .build(); + + let tasks = Box::pin(futures::stream::iter( + vec![Ok(FileScanTask { + file_size_in_bytes: std::fs::metadata(&file_path).unwrap().len(), + start: 0, + length: 0, + record_count: None, + data_file_path: file_path, + data_file_format: DataFileFormat::Parquet, + schema: iceberg_schema.clone(), + project_field_ids: vec![4], + predicate: Some(predicate.bind(iceberg_schema, true).unwrap()), + deletes: vec![], + partition: None, + partition_spec: None, + name_mapping: None, + case_sensitive: false, + })] + .into_iter(), + )) as FileScanTaskStream; + + let result = reader + .read(tasks) + .unwrap() + .try_collect::>() + .await + .unwrap(); + + let ids: Vec = result + .iter() + .flat_map(|b| { + b.column(0) + .as_primitive::() + .values() + .iter() + .copied() + }) + .collect(); + assert_eq!(ids, vec![2, 3]); + } } From e1fb7edf008285c1fccefe1eb4273f1dc724b22a Mon Sep 17 00:00:00 2001 From: Matt Butrovich Date: Wed, 15 Apr 2026 22:13:56 -0400 Subject: [PATCH 03/23] fix: incorrect Parquet INT96 timestamp values from ArrowReader (#2301) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Which issue does this PR close? - Closes #2299. ## What changes are included in this PR? - Add `coerce_int96_timestamps()` to patch the Arrow schema before reading, using arrow-rs's schema hint mechanism (`ArrowReaderOptions::with_schema`) to read INT96 columns at the resolution specified by the Iceberg table schema - `timestamp`/`timestamptz` → microsecond, `timestamp_ns`/`timestamptz_ns` → nanosecond, per the [Iceberg spec](https://iceberg.apache.org/spec/#primitive-types) - Falls back to microsecond when no field ID is available (matching Iceberg Java's `TimestampInt96Reader` behavior) - Applied after all three schema resolution branches (with field IDs, name mapping, positional fallback) so the fix covers both native and migrated tables - Handles INT96 inside nested types (structs, lists, maps) via `ArrowSchemaVisitor` traversal - Visitor and tests live in a standalone `arrow/int96.rs` module to keep `reader.rs` manageable - Made `visit_schema` in `arrow/schema.rs` `pub(crate)` so the coercion visitor can reuse the existing traversal ## Are these changes tested? - `test_read_int96_timestamps_with_field_ids` — files with embedded field IDs (branch 1) - `test_read_int96_timestamps_without_field_ids` — migrated files without field IDs (branches 2/3) - `test_read_int96_timestamps_in_struct` — INT96 inside a struct field - `test_read_int96_timestamps_in_list` — INT96 inside a list field (3-level Parquet LIST encoding) - `test_read_int96_timestamps_in_map` — INT96 as map values - All tests use dates outside the i64 nanosecond range (~1677-2262) to confirm the overflow is avoided - [Apache DataFusion Comet](https://github.com/apache/datafusion-comet) used the repro test in [apache/datafusion-comet#3856](https://github.com/apache/datafusion-comet/issues/3856) and it passes with this change: https://github.com/apache/datafusion-comet/pull/3857 (cherry picked from commit a2f067d0225d66ab88b8a18ec25b8a0953e35082) --- crates/iceberg/src/arrow/int96.rs | 578 +++++++++++++++++++++++++++++ crates/iceberg/src/arrow/mod.rs | 1 + crates/iceberg/src/arrow/reader.rs | 575 ++++++++++++++++++++++++++++ crates/iceberg/src/arrow/schema.rs | 5 +- 4 files changed, 1158 insertions(+), 1 deletion(-) create mode 100644 crates/iceberg/src/arrow/int96.rs diff --git a/crates/iceberg/src/arrow/int96.rs b/crates/iceberg/src/arrow/int96.rs new file mode 100644 index 0000000000..63a7a30f1a --- /dev/null +++ b/crates/iceberg/src/arrow/int96.rs @@ -0,0 +1,578 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +//! INT96 timestamp coercion for Parquet files. + +use std::sync::Arc; + +use arrow_schema::{ + DataType, Field, Fields, Schema as ArrowSchema, SchemaRef as ArrowSchemaRef, TimeUnit, +}; +use parquet::arrow::PARQUET_FIELD_ID_META_KEY; + +use crate::arrow::schema::{ArrowSchemaVisitor, DEFAULT_MAP_FIELD_NAME, visit_schema}; +use crate::error::Result; +use crate::spec::{PrimitiveType, Schema, Type}; +use crate::{Error, ErrorKind}; + +/// Coerce Arrow schema types for INT96 columns to match the Iceberg table schema. +/// +/// arrow-rs defaults INT96 to `Timestamp(Nanosecond)`, which overflows i64 for dates outside +/// ~1677-2262. We use arrow-rs's schema hint mechanism to read INT96 at the resolution +/// specified by the Iceberg schema (`timestamp` → microsecond, `timestamp_ns` → nanosecond). +/// +/// Iceberg Java handles this differently: it bypasses parquet-mr with a custom column reader +/// (`GenericParquetReaders.TimestampInt96Reader`). We achieve the same result via schema hints. +/// +/// References: +/// - Iceberg spec primitive types: +/// - arrow-rs schema hint support: +pub(crate) fn coerce_int96_timestamps( + arrow_schema: &ArrowSchemaRef, + iceberg_schema: &Schema, +) -> Option> { + let mut visitor = Int96CoercionVisitor::new(iceberg_schema); + let coerced = visit_schema(arrow_schema, &mut visitor).ok()?; + if visitor.changed { + Some(Arc::new(coerced)) + } else { + None + } +} + +/// Visitor that coerces `Timestamp(Nanosecond)` Arrow fields to the resolution +/// indicated by the Iceberg schema. +struct Int96CoercionVisitor<'a> { + iceberg_schema: &'a Schema, + // TODO(#2310): use FieldRef (Arc) once ArrowSchemaVisitor passes FieldRef. + field_stack: Vec, + changed: bool, +} + +impl<'a> Int96CoercionVisitor<'a> { + fn new(iceberg_schema: &'a Schema) -> Self { + Self { + iceberg_schema, + field_stack: Vec::new(), + changed: false, + } + } + + /// Determine the target TimeUnit for a Timestamp(Nanosecond) field based on the + /// Iceberg schema. Falls back to microsecond when field IDs are unavailable, + /// matching Iceberg Java behavior. + fn target_unit(&self, field: &Field) -> Option { + if !matches!( + field.data_type(), + DataType::Timestamp(TimeUnit::Nanosecond, _) + ) { + return None; + } + + let target = field + .metadata() + .get(PARQUET_FIELD_ID_META_KEY) + .and_then(|id_str| id_str.parse::().ok()) + .and_then(|field_id| self.iceberg_schema.field_by_id(field_id)) + .and_then(|f| match &*f.field_type { + Type::Primitive(PrimitiveType::Timestamp | PrimitiveType::Timestamptz) => { + Some(TimeUnit::Microsecond) + } + Type::Primitive(PrimitiveType::TimestampNs | PrimitiveType::TimestamptzNs) => { + Some(TimeUnit::Nanosecond) + } + _ => None, + }) + // Iceberg Java reads INT96 as microseconds by default + .unwrap_or(TimeUnit::Microsecond); + + if target == TimeUnit::Nanosecond { + None + } else { + Some(target) + } + } +} + +impl ArrowSchemaVisitor for Int96CoercionVisitor<'_> { + type T = Field; + type U = ArrowSchema; + + fn before_field(&mut self, field: &Field) -> Result<()> { + self.field_stack.push(field.as_ref().clone()); + Ok(()) + } + + fn after_field(&mut self, _field: &Field) -> Result<()> { + self.field_stack.pop(); + Ok(()) + } + + fn before_list_element(&mut self, field: &Field) -> Result<()> { + self.field_stack.push(field.as_ref().clone()); + Ok(()) + } + + fn after_list_element(&mut self, _field: &Field) -> Result<()> { + self.field_stack.pop(); + Ok(()) + } + + fn before_map_key(&mut self, field: &Field) -> Result<()> { + self.field_stack.push(field.as_ref().clone()); + Ok(()) + } + + fn after_map_key(&mut self, _field: &Field) -> Result<()> { + self.field_stack.pop(); + Ok(()) + } + + fn before_map_value(&mut self, field: &Field) -> Result<()> { + self.field_stack.push(field.as_ref().clone()); + Ok(()) + } + + fn after_map_value(&mut self, _field: &Field) -> Result<()> { + self.field_stack.pop(); + Ok(()) + } + + fn schema(&mut self, schema: &ArrowSchema, values: Vec) -> Result { + Ok(ArrowSchema::new_with_metadata( + values, + schema.metadata().clone(), + )) + } + + fn r#struct(&mut self, _fields: &Fields, results: Vec) -> Result { + let field_info = self + .field_stack + .last() + .ok_or_else(|| Error::new(ErrorKind::Unexpected, "Field stack underflow in struct"))?; + Ok(Field::new( + field_info.name(), + DataType::Struct(Fields::from(results)), + field_info.is_nullable(), + ) + .with_metadata(field_info.metadata().clone())) + } + + fn list(&mut self, list: &DataType, value: Field) -> Result { + let field_info = self + .field_stack + .last() + .ok_or_else(|| Error::new(ErrorKind::Unexpected, "Field stack underflow in list"))?; + let list_type = match list { + DataType::List(_) => DataType::List(Arc::new(value)), + DataType::LargeList(_) => DataType::LargeList(Arc::new(value)), + DataType::FixedSizeList(_, size) => DataType::FixedSizeList(Arc::new(value), *size), + _ => { + return Err(Error::new( + ErrorKind::Unexpected, + format!("Expected list type, got {list}"), + )); + } + }; + Ok( + Field::new(field_info.name(), list_type, field_info.is_nullable()) + .with_metadata(field_info.metadata().clone()), + ) + } + + fn map(&mut self, map: &DataType, key_value: Field, value: Field) -> Result { + let field_info = self + .field_stack + .last() + .ok_or_else(|| Error::new(ErrorKind::Unexpected, "Field stack underflow in map"))?; + let sorted = match map { + DataType::Map(_, sorted) => *sorted, + _ => { + return Err(Error::new( + ErrorKind::Unexpected, + format!("Expected map type, got {map}"), + )); + } + }; + let struct_field = Field::new( + DEFAULT_MAP_FIELD_NAME, + DataType::Struct(Fields::from(vec![key_value, value])), + false, + ); + Ok(Field::new( + field_info.name(), + DataType::Map(Arc::new(struct_field), sorted), + field_info.is_nullable(), + ) + .with_metadata(field_info.metadata().clone())) + } + + fn primitive(&mut self, p: &DataType) -> Result { + let field_info = self.field_stack.last().ok_or_else(|| { + Error::new(ErrorKind::Unexpected, "Field stack underflow in primitive") + })?; + + if let Some(target_unit) = self.target_unit(field_info) { + let tz = match field_info.data_type() { + DataType::Timestamp(_, tz) => tz.clone(), + _ => None, + }; + self.changed = true; + Ok(Field::new( + field_info.name(), + DataType::Timestamp(target_unit, tz), + field_info.is_nullable(), + ) + .with_metadata(field_info.metadata().clone())) + } else { + Ok( + Field::new(field_info.name(), p.clone(), field_info.is_nullable()) + .with_metadata(field_info.metadata().clone()), + ) + } + } +} + +#[cfg(test)] +mod tests { + use std::collections::HashMap; + use std::sync::Arc; + + use arrow_schema::{DataType, Field, Schema as ArrowSchema, TimeUnit}; + use parquet::arrow::PARQUET_FIELD_ID_META_KEY; + + use super::coerce_int96_timestamps; + use crate::spec::{ListType, MapType, NestedField, PrimitiveType, Schema, StructType, Type}; + + fn iceberg_schema_with_timestamp() -> Schema { + Schema::builder() + .with_schema_id(1) + .with_fields(vec![ + NestedField::optional(1, "ts", Type::Primitive(PrimitiveType::Timestamp)).into(), + NestedField::required(2, "id", Type::Primitive(PrimitiveType::Int)).into(), + ]) + .build() + .unwrap() + } + + fn field_id_meta(id: i32) -> HashMap { + HashMap::from([(PARQUET_FIELD_ID_META_KEY.to_string(), id.to_string())]) + } + + #[test] + fn test_coerce_timestamp_ns_to_us() { + let arrow_schema = Arc::new(ArrowSchema::new(vec![ + Field::new("ts", DataType::Timestamp(TimeUnit::Nanosecond, None), true) + .with_metadata(field_id_meta(1)), + Field::new("id", DataType::Int32, false).with_metadata(field_id_meta(2)), + ])); + let iceberg = iceberg_schema_with_timestamp(); + + let coerced = coerce_int96_timestamps(&arrow_schema, &iceberg).unwrap(); + assert_eq!( + coerced.field(0).data_type(), + &DataType::Timestamp(TimeUnit::Microsecond, None) + ); + // Non-timestamp field unchanged + assert_eq!(coerced.field(1).data_type(), &DataType::Int32); + } + + #[test] + fn test_coerce_timestamptz_ns_to_us() { + let iceberg = Schema::builder() + .with_schema_id(1) + .with_fields(vec![ + NestedField::optional(1, "ts", Type::Primitive(PrimitiveType::Timestamptz)).into(), + ]) + .build() + .unwrap(); + + let arrow_schema = Arc::new(ArrowSchema::new(vec![ + Field::new( + "ts", + DataType::Timestamp(TimeUnit::Nanosecond, Some("UTC".into())), + true, + ) + .with_metadata(field_id_meta(1)), + ])); + + let coerced = coerce_int96_timestamps(&arrow_schema, &iceberg).unwrap(); + assert_eq!( + coerced.field(0).data_type(), + &DataType::Timestamp(TimeUnit::Microsecond, Some("UTC".into())) + ); + } + + #[test] + fn test_no_coercion_when_iceberg_is_timestamp_ns() { + let iceberg = Schema::builder() + .with_schema_id(1) + .with_fields(vec![ + NestedField::optional(1, "ts", Type::Primitive(PrimitiveType::TimestampNs)).into(), + ]) + .build() + .unwrap(); + + let arrow_schema = Arc::new(ArrowSchema::new(vec![ + Field::new("ts", DataType::Timestamp(TimeUnit::Nanosecond, None), true) + .with_metadata(field_id_meta(1)), + ])); + + assert!(coerce_int96_timestamps(&arrow_schema, &iceberg).is_none()); + } + + #[test] + fn test_no_coercion_when_iceberg_is_timestamptz_ns() { + let iceberg = Schema::builder() + .with_schema_id(1) + .with_fields(vec![ + NestedField::optional(1, "ts", Type::Primitive(PrimitiveType::TimestamptzNs)) + .into(), + ]) + .build() + .unwrap(); + + let arrow_schema = Arc::new(ArrowSchema::new(vec![ + Field::new( + "ts", + DataType::Timestamp(TimeUnit::Nanosecond, Some("UTC".into())), + true, + ) + .with_metadata(field_id_meta(1)), + ])); + + assert!(coerce_int96_timestamps(&arrow_schema, &iceberg).is_none()); + } + + #[test] + fn test_no_coercion_when_already_microsecond() { + let arrow_schema = Arc::new(ArrowSchema::new(vec![ + Field::new("ts", DataType::Timestamp(TimeUnit::Microsecond, None), true) + .with_metadata(field_id_meta(1)), + Field::new("id", DataType::Int32, false).with_metadata(field_id_meta(2)), + ])); + let iceberg = iceberg_schema_with_timestamp(); + + assert!(coerce_int96_timestamps(&arrow_schema, &iceberg).is_none()); + } + + // Without field IDs, the visitor can't look up the Iceberg type and falls back + // to microsecond to match Iceberg Java behavior. + #[test] + fn test_defaults_to_us_without_field_ids() { + let arrow_schema = Arc::new(ArrowSchema::new(vec![Field::new( + "ts", + DataType::Timestamp(TimeUnit::Nanosecond, None), + true, + )])); + let iceberg = iceberg_schema_with_timestamp(); + + let coerced = coerce_int96_timestamps(&arrow_schema, &iceberg).unwrap(); + assert_eq!( + coerced.field(0).data_type(), + &DataType::Timestamp(TimeUnit::Microsecond, None) + ); + } + + // Field ID exists but points to a non-timestamp Iceberg type. The field_by_id + // lookup succeeds but the match arm returns None, so unwrap_or falls back to + // microsecond. + #[test] + fn test_defaults_to_us_when_iceberg_type_is_not_timestamp() { + let iceberg = Schema::builder() + .with_schema_id(1) + .with_fields(vec![ + NestedField::optional(1, "ts", Type::Primitive(PrimitiveType::String)).into(), + ]) + .build() + .unwrap(); + + let arrow_schema = Arc::new(ArrowSchema::new(vec![ + Field::new("ts", DataType::Timestamp(TimeUnit::Nanosecond, None), true) + .with_metadata(field_id_meta(1)), + ])); + + let coerced = coerce_int96_timestamps(&arrow_schema, &iceberg).unwrap(); + assert_eq!( + coerced.field(0).data_type(), + &DataType::Timestamp(TimeUnit::Microsecond, None) + ); + } + + #[test] + fn test_coerce_preserves_field_metadata() { + let mut meta = field_id_meta(1); + meta.insert("custom_key".to_string(), "custom_value".to_string()); + + let arrow_schema = Arc::new(ArrowSchema::new(vec![ + Field::new("ts", DataType::Timestamp(TimeUnit::Nanosecond, None), true) + .with_metadata(meta.clone()), + ])); + let iceberg = iceberg_schema_with_timestamp(); + + let coerced = coerce_int96_timestamps(&arrow_schema, &iceberg).unwrap(); + assert_eq!(coerced.field(0).metadata(), &meta); + } + + #[test] + fn test_coerce_timestamp_in_struct() { + let iceberg = Schema::builder() + .with_schema_id(1) + .with_fields(vec![ + NestedField::required( + 1, + "data", + Type::Struct(StructType::new(vec![ + NestedField::optional(2, "ts", Type::Primitive(PrimitiveType::Timestamp)) + .into(), + ])), + ) + .into(), + ]) + .build() + .unwrap(); + + let arrow_schema = Arc::new(ArrowSchema::new(vec![ + Field::new( + "data", + DataType::Struct( + vec![ + Field::new("ts", DataType::Timestamp(TimeUnit::Nanosecond, None), true) + .with_metadata(field_id_meta(2)), + ] + .into(), + ), + false, + ) + .with_metadata(field_id_meta(1)), + ])); + + let coerced = coerce_int96_timestamps(&arrow_schema, &iceberg).unwrap(); + let inner = match coerced.field(0).data_type() { + DataType::Struct(fields) => fields, + other => panic!("Expected Struct, got {other}"), + }; + assert_eq!( + inner[0].data_type(), + &DataType::Timestamp(TimeUnit::Microsecond, None) + ); + } + + #[test] + fn test_coerce_timestamp_in_list() { + let iceberg = Schema::builder() + .with_schema_id(1) + .with_fields(vec![ + NestedField::optional( + 1, + "timestamps", + Type::List(ListType { + element_field: NestedField::optional( + 2, + "element", + Type::Primitive(PrimitiveType::Timestamp), + ) + .into(), + }), + ) + .into(), + ]) + .build() + .unwrap(); + + let element_field = Field::new( + "element", + DataType::Timestamp(TimeUnit::Nanosecond, None), + true, + ) + .with_metadata(field_id_meta(2)); + let arrow_schema = Arc::new(ArrowSchema::new(vec![ + Field::new("timestamps", DataType::List(Arc::new(element_field)), true) + .with_metadata(field_id_meta(1)), + ])); + + let coerced = coerce_int96_timestamps(&arrow_schema, &iceberg).unwrap(); + let element_dt = match coerced.field(0).data_type() { + DataType::List(f) => f.data_type(), + other => panic!("Expected List, got {other}"), + }; + assert_eq!( + element_dt, + &DataType::Timestamp(TimeUnit::Microsecond, None) + ); + } + + #[test] + fn test_coerce_timestamp_in_map_value() { + let iceberg = Schema::builder() + .with_schema_id(1) + .with_fields(vec![ + NestedField::optional( + 1, + "ts_map", + Type::Map(MapType { + key_field: NestedField::required( + 2, + "key", + Type::Primitive(PrimitiveType::String), + ) + .into(), + value_field: NestedField::optional( + 3, + "value", + Type::Primitive(PrimitiveType::Timestamp), + ) + .into(), + }), + ) + .into(), + ]) + .build() + .unwrap(); + + let key_field = Field::new("key", DataType::Utf8, false).with_metadata(field_id_meta(2)); + let value_field = Field::new( + "value", + DataType::Timestamp(TimeUnit::Nanosecond, None), + true, + ) + .with_metadata(field_id_meta(3)); + let entries_field = Field::new( + "key_value", + DataType::Struct(vec![key_field, value_field].into()), + false, + ); + let arrow_schema = Arc::new(ArrowSchema::new(vec![ + Field::new( + "ts_map", + DataType::Map(Arc::new(entries_field), false), + true, + ) + .with_metadata(field_id_meta(1)), + ])); + + let coerced = coerce_int96_timestamps(&arrow_schema, &iceberg).unwrap(); + let value_dt = match coerced.field(0).data_type() { + DataType::Map(entries, _) => match entries.data_type() { + DataType::Struct(fields) => fields[1].data_type().clone(), + other => panic!("Expected Struct inside Map, got {other}"), + }, + other => panic!("Expected Map, got {other}"), + }; + assert_eq!(value_dt, DataType::Timestamp(TimeUnit::Microsecond, None)); + } +} diff --git a/crates/iceberg/src/arrow/mod.rs b/crates/iceberg/src/arrow/mod.rs index c091c45177..7823320452 100644 --- a/crates/iceberg/src/arrow/mod.rs +++ b/crates/iceberg/src/arrow/mod.rs @@ -27,6 +27,7 @@ pub(crate) mod caching_delete_file_loader; pub mod delete_file_loader; pub(crate) mod delete_filter; +mod int96; mod reader; /// RecordBatch projection utilities pub mod record_batch_projector; diff --git a/crates/iceberg/src/arrow/reader.rs b/crates/iceberg/src/arrow/reader.rs index 759ef073c4..85bc7d672c 100644 --- a/crates/iceberg/src/arrow/reader.rs +++ b/crates/iceberg/src/arrow/reader.rs @@ -46,6 +46,7 @@ use parquet::schema::types::{SchemaDescriptor, Type as ParquetType}; use typed_builder::TypedBuilder; use crate::arrow::caching_delete_file_loader::CachingDeleteFileLoader; +use crate::arrow::int96::coerce_int96_timestamps; use crate::arrow::record_batch_transformer::RecordBatchTransformerBuilder; use crate::arrow::{arrow_schema_to_schema, get_arrow_datum}; use crate::delete_vector::DeleteVector; @@ -386,6 +387,27 @@ impl ArrowReader { arrow_metadata }; + // Coerce INT96 timestamp columns to the resolution specified by the Iceberg schema. + // This must happen before building the stream reader to avoid i64 overflow in arrow-rs. + let arrow_metadata = if let Some(coerced_schema) = + coerce_int96_timestamps(arrow_metadata.schema(), &task.schema) + { + let options = ArrowReaderOptions::new().with_schema(Arc::clone(&coerced_schema)); + ArrowReaderMetadata::try_new(Arc::clone(arrow_metadata.metadata()), options).map_err( + |e| { + Error::new( + ErrorKind::Unexpected, + format!( + "Failed to create ArrowReaderMetadata with INT96-coerced schema: {coerced_schema}" + ), + ) + .with_source(e) + }, + )? + } else { + arrow_metadata + }; + // Build the stream reader, reusing the already-opened file reader let mut record_batch_stream_builder = ParquetRecordBatchStreamBuilder::new_with_metadata(parquet_file_reader, arrow_metadata); @@ -4889,4 +4911,557 @@ message schema { .collect(); assert_eq!(ids, vec![2, 3]); } + + // INT96 encoding: [nanos_low_u32, nanos_high_u32, julian_day_u32] + // Julian day 2_440_588 = Unix epoch (1970-01-01) + const UNIX_EPOCH_JULIAN: i64 = 2_440_588; + const MICROS_PER_DAY: i64 = 86_400_000_000; + // Noon on 3333-01-01 (Julian day 2_953_529) — outside the i64 nanosecond range (~1677-2262). + const INT96_TEST_NANOS_WITHIN_DAY: u64 = 43_200_000_000_000; + const INT96_TEST_JULIAN_DAY: u32 = 2_953_529; + + fn make_int96_test_value() -> (parquet::data_type::Int96, i64) { + let mut val = parquet::data_type::Int96::new(); + val.set_data( + (INT96_TEST_NANOS_WITHIN_DAY & 0xFFFFFFFF) as u32, + (INT96_TEST_NANOS_WITHIN_DAY >> 32) as u32, + INT96_TEST_JULIAN_DAY, + ); + let expected_micros = (INT96_TEST_JULIAN_DAY as i64 - UNIX_EPOCH_JULIAN) * MICROS_PER_DAY + + (INT96_TEST_NANOS_WITHIN_DAY / 1_000) as i64; + (val, expected_micros) + } + + async fn read_int96_batches( + file_path: &str, + schema: SchemaRef, + project_field_ids: Vec, + ) -> Vec { + let file_io = FileIO::new_with_fs(); + let reader = ArrowReaderBuilder::new(file_io).build(); + + let file_size = std::fs::metadata(file_path).unwrap().len(); + let task = FileScanTask { + file_size_in_bytes: file_size, + start: 0, + length: file_size, + record_count: None, + data_file_path: file_path.to_string(), + data_file_format: DataFileFormat::Parquet, + schema, + project_field_ids, + predicate: None, + deletes: vec![], + partition: None, + partition_spec: None, + name_mapping: None, + case_sensitive: false, + }; + + let tasks = Box::pin(futures::stream::iter(vec![Ok(task)])) as FileScanTaskStream; + reader.read(tasks).unwrap().try_collect().await.unwrap() + } + + // ArrowWriter cannot write INT96, so we use SerializedFileWriter directly. + fn write_int96_parquet_file( + table_location: &str, + filename: &str, + with_field_ids: bool, + ) -> (String, Vec) { + use parquet::basic::{Repetition, Type as PhysicalType}; + use parquet::data_type::{Int32Type, Int96, Int96Type}; + use parquet::file::writer::SerializedFileWriter; + use parquet::schema::types::Type as SchemaType; + + let file_path = format!("{table_location}/{filename}"); + + let mut ts_builder = SchemaType::primitive_type_builder("ts", PhysicalType::INT96) + .with_repetition(Repetition::OPTIONAL); + let mut id_builder = SchemaType::primitive_type_builder("id", PhysicalType::INT32) + .with_repetition(Repetition::REQUIRED); + + if with_field_ids { + ts_builder = ts_builder.with_id(Some(1)); + id_builder = id_builder.with_id(Some(2)); + } + + let schema = SchemaType::group_type_builder("schema") + .with_fields(vec![ + Arc::new(ts_builder.build().unwrap()), + Arc::new(id_builder.build().unwrap()), + ]) + .build() + .unwrap(); + + // Dates outside the i64 nanosecond range (~1677-2262) overflow without coercion. + const NOON_NANOS: u64 = INT96_TEST_NANOS_WITHIN_DAY; + const JULIAN_3333: u32 = INT96_TEST_JULIAN_DAY; + const JULIAN_2100: u32 = 2_488_070; + + let test_data: Vec<(u32, u32, u32, i64)> = vec![ + // 3333-01-01 00:00:00 + ( + 0, + 0, + JULIAN_3333, + (JULIAN_3333 as i64 - UNIX_EPOCH_JULIAN) * MICROS_PER_DAY, + ), + // 3333-01-01 12:00:00 + ( + (NOON_NANOS & 0xFFFFFFFF) as u32, + (NOON_NANOS >> 32) as u32, + JULIAN_3333, + (JULIAN_3333 as i64 - UNIX_EPOCH_JULIAN) * MICROS_PER_DAY + + (NOON_NANOS / 1_000) as i64, + ), + // 2100-01-01 00:00:00 + ( + 0, + 0, + JULIAN_2100, + (JULIAN_2100 as i64 - UNIX_EPOCH_JULIAN) * MICROS_PER_DAY, + ), + ]; + + let int96_values: Vec = test_data + .iter() + .map(|(lo, hi, day, _)| { + let mut v = Int96::new(); + v.set_data(*lo, *hi, *day); + v + }) + .collect(); + + let id_values: Vec = (0..test_data.len() as i32).collect(); + let expected_micros: Vec = test_data.iter().map(|(_, _, _, m)| *m).collect(); + + let file = File::create(&file_path).unwrap(); + let mut writer = + SerializedFileWriter::new(file, Arc::new(schema), Default::default()).unwrap(); + + let mut row_group = writer.next_row_group().unwrap(); + { + // def=1: ts is OPTIONAL and present. No repetition levels (top-level columns). + let mut col = row_group.next_column().unwrap().unwrap(); + col.typed::() + .write_batch(&int96_values, Some(&vec![1; test_data.len()]), None) + .unwrap(); + col.close().unwrap(); + } + { + let mut col = row_group.next_column().unwrap().unwrap(); + col.typed::() + .write_batch(&id_values, None, None) + .unwrap(); + col.close().unwrap(); + } + row_group.close().unwrap(); + writer.close().unwrap(); + + (file_path, expected_micros) + } + + async fn assert_int96_read_matches( + file_path: &str, + schema: SchemaRef, + project_field_ids: Vec, + expected_micros: &[i64], + ) { + use arrow_array::TimestampMicrosecondArray; + + let batches = read_int96_batches(file_path, schema, project_field_ids).await; + + assert_eq!(batches.len(), 1); + let ts_array = batches[0] + .column(0) + .as_any() + .downcast_ref::() + .expect("Expected TimestampMicrosecondArray"); + + for (i, expected) in expected_micros.iter().enumerate() { + assert_eq!( + ts_array.value(i), + *expected, + "Row {i}: got {}, expected {expected}", + ts_array.value(i) + ); + } + } + + #[tokio::test] + async fn test_read_int96_timestamps_with_field_ids() { + let schema = Arc::new( + Schema::builder() + .with_schema_id(1) + .with_fields(vec![ + NestedField::optional(1, "ts", Type::Primitive(PrimitiveType::Timestamp)) + .into(), + NestedField::required(2, "id", Type::Primitive(PrimitiveType::Int)).into(), + ]) + .build() + .unwrap(), + ); + + let tmp_dir = TempDir::new().unwrap(); + let table_location = tmp_dir.path().to_str().unwrap().to_string(); + let (file_path, expected_micros) = + write_int96_parquet_file(&table_location, "with_ids.parquet", true); + + assert_int96_read_matches(&file_path, schema, vec![1, 2], &expected_micros).await; + } + + #[tokio::test] + async fn test_read_int96_timestamps_without_field_ids() { + let schema = Arc::new( + Schema::builder() + .with_schema_id(1) + .with_fields(vec![ + NestedField::optional(1, "ts", Type::Primitive(PrimitiveType::Timestamp)) + .into(), + NestedField::required(2, "id", Type::Primitive(PrimitiveType::Int)).into(), + ]) + .build() + .unwrap(), + ); + + let tmp_dir = TempDir::new().unwrap(); + let table_location = tmp_dir.path().to_str().unwrap().to_string(); + let (file_path, expected_micros) = + write_int96_parquet_file(&table_location, "no_ids.parquet", false); + + assert_int96_read_matches(&file_path, schema, vec![1, 2], &expected_micros).await; + } + + #[tokio::test] + async fn test_read_int96_timestamps_in_struct() { + use arrow_array::{StructArray, TimestampMicrosecondArray}; + use parquet::basic::{Repetition, Type as PhysicalType}; + use parquet::data_type::Int96Type; + use parquet::file::writer::SerializedFileWriter; + use parquet::schema::types::Type as SchemaType; + + let tmp_dir = TempDir::new().unwrap(); + let table_location = tmp_dir.path().to_str().unwrap().to_string(); + let file_path = format!("{table_location}/struct_int96.parquet"); + + let ts_type = SchemaType::primitive_type_builder("ts", PhysicalType::INT96) + .with_repetition(Repetition::OPTIONAL) + .with_id(Some(2)) + .build() + .unwrap(); + + let struct_type = SchemaType::group_type_builder("data") + .with_repetition(Repetition::REQUIRED) + .with_id(Some(1)) + .with_fields(vec![Arc::new(ts_type)]) + .build() + .unwrap(); + + let parquet_schema = SchemaType::group_type_builder("schema") + .with_fields(vec![Arc::new(struct_type)]) + .build() + .unwrap(); + + let (int96_val, expected_micros) = make_int96_test_value(); + + let file = File::create(&file_path).unwrap(); + let mut writer = + SerializedFileWriter::new(file, Arc::new(parquet_schema), Default::default()).unwrap(); + + // def=1: struct is REQUIRED so no level, ts is OPTIONAL and present (1). + // No repetition levels needed (no repeated groups). + let mut row_group = writer.next_row_group().unwrap(); + { + let mut col = row_group.next_column().unwrap().unwrap(); + col.typed::() + .write_batch(&[int96_val], Some(&[1]), None) + .unwrap(); + col.close().unwrap(); + } + row_group.close().unwrap(); + writer.close().unwrap(); + + let iceberg_schema = Arc::new( + Schema::builder() + .with_schema_id(1) + .with_fields(vec![ + NestedField::required( + 1, + "data", + Type::Struct(crate::spec::StructType::new(vec![ + NestedField::optional( + 2, + "ts", + Type::Primitive(PrimitiveType::Timestamp), + ) + .into(), + ])), + ) + .into(), + ]) + .build() + .unwrap(), + ); + + let batches = read_int96_batches(&file_path, iceberg_schema, vec![1]).await; + + assert_eq!(batches.len(), 1); + let struct_array = batches[0] + .column(0) + .as_any() + .downcast_ref::() + .expect("Expected StructArray"); + let ts_array = struct_array + .column(0) + .as_any() + .downcast_ref::() + .expect("Expected TimestampMicrosecondArray inside struct"); + + assert_eq!( + ts_array.value(0), + expected_micros, + "INT96 in struct: got {}, expected {expected_micros}", + ts_array.value(0) + ); + } + + #[tokio::test] + async fn test_read_int96_timestamps_in_list() { + use arrow_array::{ListArray, TimestampMicrosecondArray}; + use parquet::basic::{Repetition, Type as PhysicalType}; + use parquet::data_type::Int96Type; + use parquet::file::writer::SerializedFileWriter; + use parquet::schema::types::Type as SchemaType; + + let tmp_dir = TempDir::new().unwrap(); + let table_location = tmp_dir.path().to_str().unwrap().to_string(); + let file_path = format!("{table_location}/list_int96.parquet"); + + // 3-level LIST encoding: + // optional group timestamps (LIST) { + // repeated group list { + // optional int96 element; + // } + // } + let element_type = SchemaType::primitive_type_builder("element", PhysicalType::INT96) + .with_repetition(Repetition::OPTIONAL) + .with_id(Some(2)) + .build() + .unwrap(); + + let list_group = SchemaType::group_type_builder("list") + .with_repetition(Repetition::REPEATED) + .with_fields(vec![Arc::new(element_type)]) + .build() + .unwrap(); + + let list_type = SchemaType::group_type_builder("timestamps") + .with_repetition(Repetition::OPTIONAL) + .with_id(Some(1)) + .with_logical_type(Some(parquet::basic::LogicalType::List)) + .with_fields(vec![Arc::new(list_group)]) + .build() + .unwrap(); + + let parquet_schema = SchemaType::group_type_builder("schema") + .with_fields(vec![Arc::new(list_type)]) + .build() + .unwrap(); + + let (int96_val, expected_micros) = make_int96_test_value(); + + let file = File::create(&file_path).unwrap(); + let mut writer = + SerializedFileWriter::new(file, Arc::new(parquet_schema), Default::default()).unwrap(); + + // Write a single row with a list containing one INT96 element. + // def=3: list present (1) + repeated group (2) + element present (3) + // rep=0: start of a new list + let mut row_group = writer.next_row_group().unwrap(); + { + let mut col = row_group.next_column().unwrap().unwrap(); + col.typed::() + .write_batch(&[int96_val], Some(&[3]), Some(&[0])) + .unwrap(); + col.close().unwrap(); + } + row_group.close().unwrap(); + writer.close().unwrap(); + + let iceberg_schema = Arc::new( + Schema::builder() + .with_schema_id(1) + .with_fields(vec![ + NestedField::optional( + 1, + "timestamps", + Type::List(crate::spec::ListType { + element_field: NestedField::optional( + 2, + "element", + Type::Primitive(PrimitiveType::Timestamp), + ) + .into(), + }), + ) + .into(), + ]) + .build() + .unwrap(), + ); + + let batches = read_int96_batches(&file_path, iceberg_schema, vec![1]).await; + + assert_eq!(batches.len(), 1); + let list_array = batches[0] + .column(0) + .as_any() + .downcast_ref::() + .expect("Expected ListArray"); + let ts_array = list_array + .values() + .as_any() + .downcast_ref::() + .expect("Expected TimestampMicrosecondArray inside list"); + + assert_eq!( + ts_array.value(0), + expected_micros, + "INT96 in list: got {}, expected {expected_micros}", + ts_array.value(0) + ); + } + + #[tokio::test] + async fn test_read_int96_timestamps_in_map() { + use arrow_array::{MapArray, TimestampMicrosecondArray}; + use parquet::basic::{Repetition, Type as PhysicalType}; + use parquet::data_type::{ByteArrayType, Int96Type}; + use parquet::file::writer::SerializedFileWriter; + use parquet::schema::types::Type as SchemaType; + + let tmp_dir = TempDir::new().unwrap(); + let table_location = tmp_dir.path().to_str().unwrap().to_string(); + let file_path = format!("{table_location}/map_int96.parquet"); + + // MAP encoding: + // optional group ts_map (MAP) { + // repeated group key_value { + // required binary key (UTF8); + // optional int96 value; + // } + // } + let key_type = SchemaType::primitive_type_builder("key", PhysicalType::BYTE_ARRAY) + .with_repetition(Repetition::REQUIRED) + .with_logical_type(Some(parquet::basic::LogicalType::String)) + .with_id(Some(2)) + .build() + .unwrap(); + + let value_type = SchemaType::primitive_type_builder("value", PhysicalType::INT96) + .with_repetition(Repetition::OPTIONAL) + .with_id(Some(3)) + .build() + .unwrap(); + + let key_value_group = SchemaType::group_type_builder("key_value") + .with_repetition(Repetition::REPEATED) + .with_fields(vec![Arc::new(key_type), Arc::new(value_type)]) + .build() + .unwrap(); + + let map_type = SchemaType::group_type_builder("ts_map") + .with_repetition(Repetition::OPTIONAL) + .with_id(Some(1)) + .with_logical_type(Some(parquet::basic::LogicalType::Map)) + .with_fields(vec![Arc::new(key_value_group)]) + .build() + .unwrap(); + + let parquet_schema = SchemaType::group_type_builder("schema") + .with_fields(vec![Arc::new(map_type)]) + .build() + .unwrap(); + + let (int96_val, expected_micros) = make_int96_test_value(); + + let file = File::create(&file_path).unwrap(); + let mut writer = + SerializedFileWriter::new(file, Arc::new(parquet_schema), Default::default()).unwrap(); + + // Write a single row with a map containing one key-value pair. + // rep=0 for both columns: start of a new map. + // key def=2: map present (1) + key_value entry present (2), key is REQUIRED. + // value def=3: map present (1) + key_value entry present (2) + value present (3). + let mut row_group = writer.next_row_group().unwrap(); + { + let mut col = row_group.next_column().unwrap().unwrap(); + col.typed::() + .write_batch( + &[parquet::data_type::ByteArray::from("event_time")], + Some(&[2]), + Some(&[0]), + ) + .unwrap(); + col.close().unwrap(); + } + { + let mut col = row_group.next_column().unwrap().unwrap(); + col.typed::() + .write_batch(&[int96_val], Some(&[3]), Some(&[0])) + .unwrap(); + col.close().unwrap(); + } + row_group.close().unwrap(); + writer.close().unwrap(); + + let iceberg_schema = Arc::new( + Schema::builder() + .with_schema_id(1) + .with_fields(vec![ + NestedField::optional( + 1, + "ts_map", + Type::Map(crate::spec::MapType { + key_field: NestedField::required( + 2, + "key", + Type::Primitive(PrimitiveType::String), + ) + .into(), + value_field: NestedField::optional( + 3, + "value", + Type::Primitive(PrimitiveType::Timestamp), + ) + .into(), + }), + ) + .into(), + ]) + .build() + .unwrap(), + ); + + let batches = read_int96_batches(&file_path, iceberg_schema, vec![1]).await; + + assert_eq!(batches.len(), 1); + let map_array = batches[0] + .column(0) + .as_any() + .downcast_ref::() + .expect("Expected MapArray"); + let ts_array = map_array + .values() + .as_any() + .downcast_ref::() + .expect("Expected TimestampMicrosecondArray as map values"); + + assert_eq!( + ts_array.value(0), + expected_micros, + "INT96 in map: got {}, expected {expected_micros}", + ts_array.value(0) + ); + } } diff --git a/crates/iceberg/src/arrow/schema.rs b/crates/iceberg/src/arrow/schema.rs index bd9e249f48..f96c29ab4a 100644 --- a/crates/iceberg/src/arrow/schema.rs +++ b/crates/iceberg/src/arrow/schema.rs @@ -199,7 +199,10 @@ fn visit_struct(fields: &Fields, visitor: &mut V) -> Resu } /// Visit schema in post order. -fn visit_schema(schema: &ArrowSchema, visitor: &mut V) -> Result { +pub(crate) fn visit_schema( + schema: &ArrowSchema, + visitor: &mut V, +) -> Result { let mut results = Vec::with_capacity(schema.fields().len()); for field in schema.fields() { visitor.before_field(field)?; From 112ffe6f3c9ffc9761bcf991931d0d36ecf244fb Mon Sep 17 00:00:00 2001 From: "R. Conner Howell" <5731503+rchowell@users.noreply.github.com> Date: Wed, 15 Apr 2026 02:54:16 -0700 Subject: [PATCH 04/23] fix(s3tables): use 's3' as the default scheme (#2313) ## Which issue does this PR close? - Closes #2312 ## What changes are included in this PR? Changes the s3tables default scheme to "s3://" ## Are these changes tested? With this change, I can read files resolved through an s3table catalog now. (cherry picked from commit b06b5734b87f64062c33bf65f73062356ba87d91) --- crates/catalog/s3tables/src/catalog.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/catalog/s3tables/src/catalog.rs b/crates/catalog/s3tables/src/catalog.rs index afe28ae453..d831118e74 100644 --- a/crates/catalog/s3tables/src/catalog.rs +++ b/crates/catalog/s3tables/src/catalog.rs @@ -201,7 +201,7 @@ impl S3TablesCatalog { // Use provided factory or default to OpenDalStorageFactory::S3 let factory = storage_factory.unwrap_or_else(|| { Arc::new(OpenDalStorageFactory::S3 { - configured_scheme: "s3a".to_string(), + configured_scheme: "s3".to_string(), customized_credential_load: None, }) }); From c982fb6a05bd7b4f25b46ff60373db4893305953 Mon Sep 17 00:00:00 2001 From: Shawn Chang Date: Fri, 17 Apr 2026 14:45:01 -0700 Subject: [PATCH 05/23] update Cargo.lock --- Cargo.lock | 171 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 110 insertions(+), 61 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 23b5bf92e6..47d65e614e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -192,16 +192,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4754a624e5ae42081f464514be454b39711daae0458906dacde5f4c632f33a8" dependencies = [ "arrow-arith", - "arrow-array", - "arrow-buffer", + "arrow-array 57.3.0", + "arrow-buffer 57.3.0", "arrow-cast", "arrow-csv", - "arrow-data", + "arrow-data 57.3.0", "arrow-ipc", "arrow-json", "arrow-ord", "arrow-row", - "arrow-schema", + "arrow-schema 57.3.0", "arrow-select", "arrow-string", ] @@ -212,10 +212,10 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7b3141e0ec5145a22d8694ea8b6d6f69305971c4fa1c1a13ef0195aef2d678b" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-array 57.3.0", + "arrow-buffer 57.3.0", + "arrow-data 57.3.0", + "arrow-schema 57.3.0", "chrono", "num-traits", ] @@ -227,9 +227,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c8955af33b25f3b175ee10af580577280b4bd01f7e823d94c7cdef7cf8c9aef" dependencies = [ "ahash", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-buffer 57.3.0", + "arrow-data 57.3.0", + "arrow-schema 57.3.0", "chrono", "chrono-tz", "half", @@ -239,6 +239,24 @@ dependencies = [ "num-traits", ] +[[package]] +name = "arrow-array" +version = "58.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772bd34cacdda8baec9418d80d23d0fb4d50ef0735685bd45158b83dfeb6e62d" +dependencies = [ + "ahash", + "arrow-buffer 58.1.0", + "arrow-data 58.1.0", + "arrow-schema 58.1.0", + "chrono", + "half", + "hashbrown 0.16.1", + "num-complex", + "num-integer", + "num-traits", +] + [[package]] name = "arrow-buffer" version = "57.3.0" @@ -251,17 +269,29 @@ dependencies = [ "num-traits", ] +[[package]] +name = "arrow-buffer" +version = "58.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "898f4cf1e9598fdb77f356fdf2134feedfd0ee8d5a4e0a5f573e7d0aec16baa4" +dependencies = [ + "bytes", + "half", + "num-bigint", + "num-traits", +] + [[package]] name = "arrow-cast" version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "646bbb821e86fd57189c10b4fcdaa941deaf4181924917b0daa92735baa6ada5" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", + "arrow-array 57.3.0", + "arrow-buffer 57.3.0", + "arrow-data 57.3.0", "arrow-ord", - "arrow-schema", + "arrow-schema 57.3.0", "arrow-select", "atoi", "base64", @@ -279,9 +309,9 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da746f4180004e3ce7b83c977daf6394d768332349d3d913998b10a120b790a" dependencies = [ - "arrow-array", + "arrow-array 57.3.0", "arrow-cast", - "arrow-schema", + "arrow-schema 57.3.0", "chrono", "csv", "csv-core", @@ -294,8 +324,21 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fdd994a9d28e6365aa78e15da3f3950c0fdcea6b963a12fa1c391afb637b304" dependencies = [ - "arrow-buffer", - "arrow-schema", + "arrow-buffer 57.3.0", + "arrow-schema 57.3.0", + "half", + "num-integer", + "num-traits", +] + +[[package]] +name = "arrow-data" +version = "58.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d10beeab2b1c3bb0b53a00f7c944a178b622173a5c7bcabc3cb45d90238df4" +dependencies = [ + "arrow-buffer 58.1.0", + "arrow-schema 58.1.0", "half", "num-integer", "num-traits", @@ -307,10 +350,10 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abf7df950701ab528bf7c0cf7eeadc0445d03ef5d6ffc151eaae6b38a58feff1" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-array 57.3.0", + "arrow-buffer 57.3.0", + "arrow-data 57.3.0", + "arrow-schema 57.3.0", "arrow-select", "flatbuffers", "lz4_flex", @@ -323,11 +366,11 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ff8357658bedc49792b13e2e862b80df908171275f8e6e075c460da5ee4bf86" dependencies = [ - "arrow-array", - "arrow-buffer", + "arrow-array 57.3.0", + "arrow-buffer 57.3.0", "arrow-cast", - "arrow-data", - "arrow-schema", + "arrow-data 57.3.0", + "arrow-schema 57.3.0", "chrono", "half", "indexmap 2.13.0", @@ -347,10 +390,10 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d8f1870e03d4cbed632959498bcc84083b5a24bded52905ae1695bd29da45b" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-array 57.3.0", + "arrow-buffer 57.3.0", + "arrow-data 57.3.0", + "arrow-schema 57.3.0", "arrow-select", ] @@ -360,10 +403,10 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18228633bad92bff92a95746bbeb16e5fc318e8382b75619dec26db79e4de4c0" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-array 57.3.0", + "arrow-buffer 57.3.0", + "arrow-data 57.3.0", + "arrow-schema 57.3.0", "half", ] @@ -377,6 +420,12 @@ dependencies = [ "serde_json", ] +[[package]] +name = "arrow-schema" +version = "58.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c30a1365d7a7dc50cc847e54154e6af49e4c4b0fddc9f607b687f29212082743" + [[package]] name = "arrow-select" version = "57.3.0" @@ -384,10 +433,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68bf3e3efbd1278f770d67e5dc410257300b161b93baedb3aae836144edcaf4b" dependencies = [ "ahash", - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-array 57.3.0", + "arrow-buffer 57.3.0", + "arrow-data 57.3.0", + "arrow-schema 57.3.0", "num-traits", ] @@ -397,10 +446,10 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85e968097061b3c0e9fe3079cf2e703e487890700546b5b0647f60fca1b5a8d8" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-array 57.3.0", + "arrow-buffer 57.3.0", + "arrow-data 57.3.0", + "arrow-schema 57.3.0", "arrow-select", "memchr", "num-traits", @@ -1612,7 +1661,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "503f1f4a9060ae6e650d3dff5dc7a21266fea1302d890768d45b4b28586e830f" dependencies = [ "arrow", - "arrow-schema", + "arrow-schema 57.3.0", "async-trait", "bytes", "bzip2", @@ -1999,7 +2048,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "189256495dc9cbbb8e20dbcf161f60422e628d201a78df8207e44bd4baefadb6" dependencies = [ "arrow", - "arrow-buffer", + "arrow-buffer 57.3.0", "base64", "blake2", "blake3", @@ -2239,7 +2288,7 @@ dependencies = [ "ahash", "arrow", "arrow-ord", - "arrow-schema", + "arrow-schema 57.3.0", "async-trait", "datafusion-common", "datafusion-common-runtime", @@ -3330,11 +3379,11 @@ dependencies = [ "apache-avro", "array-init", "arrow-arith", - "arrow-array", - "arrow-buffer", + "arrow-array 57.3.0", + "arrow-buffer 57.3.0", "arrow-cast", "arrow-ord", - "arrow-schema", + "arrow-schema 57.3.0", "arrow-select", "arrow-string", "as-any", @@ -3526,8 +3575,8 @@ dependencies = [ name = "iceberg-integration-tests" version = "0.9.0" dependencies = [ - "arrow-array", - "arrow-schema", + "arrow-array 57.3.0", + "arrow-schema 57.3.0", "futures", "iceberg", "iceberg-catalog-rest", @@ -4137,10 +4186,10 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5240d6977234968ff9ad254bfa73aa397fb51e41dcb22b1eb85835e9295485b" dependencies = [ - "arrow-array", - "arrow-buffer", - "arrow-data", - "arrow-schema", + "arrow-array 58.1.0", + "arrow-buffer 58.1.0", + "arrow-data 58.1.0", + "arrow-schema 58.1.0", "bytemuck", "half", "serde", @@ -4669,12 +4718,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ee96b29972a257b855ff2341b37e61af5f12d6af1158b6dcdb5b31ea07bb3cb" dependencies = [ "ahash", - "arrow-array", - "arrow-buffer", + "arrow-array 57.3.0", + "arrow-buffer 57.3.0", "arrow-cast", - "arrow-data", + "arrow-data 57.3.0", "arrow-ipc", - "arrow-schema", + "arrow-schema 57.3.0", "arrow-select", "base64", "brotli", @@ -5862,8 +5911,8 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2784e59a0315568e850cb01ddadf458f8c09e28d8cfc4880c2cc08f5dc3444e0" dependencies = [ - "arrow-array", - "arrow-schema", + "arrow-array 58.1.0", + "arrow-schema 58.1.0", "bytemuck", "chrono", "half", From fb02e755c1eb0e1ddbfcee6cb32dad02b52677ac Mon Sep 17 00:00:00 2001 From: maybe-vibe <268501654+maybe-vibe@users.noreply.github.com> Date: Sun, 22 Mar 2026 19:54:04 -0700 Subject: [PATCH 06/23] chore(deps): fix audit check and disable inherited aws sdk default features (#2274) ## Which issue does this PR close? - Fix the audit check by updating `aws-lc-sys` and `rustls-webpki`. - Avoid pulling both the legacy `rustls` / Hyper 0.14 stack and the newer `default-https-client` stack through inherited AWS SDK defaults. ([AWS SDK announcement](https://github.com/awslabs/aws-sdk-rust/discussions/1257)) ## What changes are included in this PR? - Bump to `aws-lc-sys>=0.39.0` and `rustls-webpki>=0.103.10` to pass security audit. - Disable inherited AWS SDK default features for `aws-sdk-glue` and `aws-sdk-s3tables` - Explicitly enable `default-https-client` and `rt-tokio` - Bump the minimum `aws-sdk-glue` version to `1.85`, the first version that provides `default-https-client` ## Are these changes tested? --------- Co-authored-by: blackmwk (cherry picked from commit 2820d47a549b38c56a453788ff5bff3296003eb2) --- Cargo.lock | 162 +++++++++-------------------------------------------- Cargo.toml | 4 +- 2 files changed, 30 insertions(+), 136 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 47d65e614e..cf3a587351 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -595,9 +595,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.16.1" +version = "1.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bffc006df10ac2a68c83692d734a465f8ee6c5b384d8545a636f81d858f4bf" +checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" dependencies = [ "aws-lc-sys", "zeroize", @@ -605,9 +605,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4321e568ed89bb5a7d291a7f37997c2c0df89809d7b6d12062c81ddb54aa782e" +checksum = "1fa7e52a4c5c547c741610a2c6f123f3881e409b714cd27e6798ef020c514f0a" dependencies = [ "cc", "cmake", @@ -824,23 +824,17 @@ dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", - "h2 0.3.27", - "h2 0.4.13", - "http 0.2.12", + "h2", "http 1.4.0", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper 1.8.1", - "hyper-rustls 0.24.2", - "hyper-rustls 0.27.7", + "hyper", + "hyper-rustls", "hyper-util", "pin-project-lite", - "rustls 0.21.12", - "rustls 0.23.37", + "rustls", "rustls-native-certs", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tower", "tracing", ] @@ -3026,25 +3020,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "h2" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap 2.13.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "h2" version = "0.4.13" @@ -3244,30 +3219,6 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" -[[package]] -name = "hyper" -version = "0.14.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.27", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.10", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.8.1" @@ -3278,7 +3229,7 @@ dependencies = [ "bytes", "futures-channel", "futures-core", - "h2 0.4.13", + "h2", "http 1.4.0", "http-body 1.0.1", "httparse", @@ -3291,21 +3242,6 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.32", - "log", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", -] - [[package]] name = "hyper-rustls" version = "0.27.7" @@ -3313,13 +3249,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ "http 1.4.0", - "hyper 1.8.1", + "hyper", "hyper-util", - "rustls 0.23.37", + "rustls", "rustls-native-certs", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tower-service", "webpki-roots 1.0.6", ] @@ -3336,7 +3272,7 @@ dependencies = [ "futures-util", "http 1.4.0", "http-body 1.0.1", - "hyper 1.8.1", + "hyper", "ipnet", "libc", "percent-encoding", @@ -4311,7 +4247,7 @@ dependencies = [ "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", + "hyper", "hyper-util", "log", "pin-project-lite", @@ -4565,7 +4501,7 @@ dependencies = [ "http 1.4.0", "http-body-util", "humantime", - "hyper 1.8.1", + "hyper", "itertools 0.14.0", "md-5", "parking_lot", @@ -5183,7 +5119,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.37", + "rustls", "socket2 0.6.2", "thiserror 2.0.18", "tokio", @@ -5203,7 +5139,7 @@ dependencies = [ "rand 0.9.2", "ring", "rustc-hash", - "rustls 0.23.37", + "rustls", "rustls-pki-types", "slab", "thiserror 2.0.18", @@ -5483,19 +5419,19 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "h2 0.4.13", + "h2", "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", - "hyper-rustls 0.27.7", + "hyper", + "hyper-rustls", "hyper-util", "js-sys", "log", "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.37", + "rustls", "rustls-native-certs", "rustls-pki-types", "serde", @@ -5503,7 +5439,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tokio-util", "tower", "tower-http", @@ -5631,18 +5567,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - [[package]] name = "rustls" version = "0.23.37" @@ -5653,7 +5577,7 @@ dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.9", + "rustls-webpki", "subtle", "zeroize", ] @@ -5691,19 +5615,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.9" +version = "0.103.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" dependencies = [ "aws-lc-rs", "ring", @@ -5837,16 +5751,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "security-framework" version = "3.7.0" @@ -6336,7 +6240,7 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", - "rustls 0.23.37", + "rustls", "serde", "serde_json", "sha2", @@ -6794,23 +6698,13 @@ dependencies = [ "syn", ] -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.37", + "rustls", "tokio", ] diff --git a/Cargo.toml b/Cargo.toml index b3290d564f..8ef6feeabe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,8 +54,8 @@ arrow-string = "57.1" as-any = "0.3.2" async-trait = "0.1.89" aws-config = "1.8.7" -aws-sdk-glue = "1.39" -aws-sdk-s3tables = "1.28.0" +aws-sdk-glue = { version = "1.85", default-features = false, features = ["default-https-client", "rt-tokio"] } +aws-sdk-s3tables = { version = "1.28", default-features = false, features = ["default-https-client", "rt-tokio"] } backon = "1.5.1" base64 = "0.22.1" bimap = "0.6" From a4ae8e7659cab5239b9aaabb36bcb02ffad816fc Mon Sep 17 00:00:00 2001 From: blackmwk Date: Tue, 24 Mar 2026 23:36:30 +0800 Subject: [PATCH 07/23] chore(deps): Bump rustls-webpki from 0.103.7 to 0.103.10 in bindings/python (#2278) Addresses the security advisory GHSA-pwjx-qhcg-rvj4 for rustls-webpki < 0.103.10 in the Python bindings lockfile. This is a rebase of #2268 onto main which already includes the root Cargo.lock audit fix from #2274 (aws-lc-sys >= 0.39.0). ## Which issue does this PR close? - Closes #. ## What changes are included in this PR? ## Are these changes tested? ci. (cherry picked from commit 1f1ba537bc9abad2214e1850e664e24d051bfa75) --- bindings/python/Cargo.lock | 271 ++++++++++++++++++++++++++++++++++++- 1 file changed, 269 insertions(+), 2 deletions(-) diff --git a/bindings/python/Cargo.lock b/bindings/python/Cargo.lock index 7667a0b1a3..b93715c895 100644 --- a/bindings/python/Cargo.lock +++ b/bindings/python/Cargo.lock @@ -56,6 +56,17 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + [[package]] name = "ahash" version = "0.8.12" @@ -504,6 +515,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + [[package]] name = "bigdecimal" version = "0.4.9" @@ -561,6 +578,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + [[package]] name = "bnum" version = "0.12.1" @@ -650,6 +676,15 @@ dependencies = [ "libbz2-rs-sys", ] +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + [[package]] name = "cc" version = "1.2.43" @@ -698,6 +733,16 @@ dependencies = [ "phf", ] +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "comfy-table" version = "7.1.2" @@ -1694,6 +1739,17 @@ dependencies = [ "sqlparser", ] +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "deranged" version = "0.5.5" @@ -2355,6 +2411,7 @@ dependencies = [ "async-trait", "bytes", "cfg-if", + "futures", "iceberg", "opendal", "reqsign", @@ -2504,6 +2561,16 @@ dependencies = [ "rustversion", ] +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "block-padding", + "generic-array", +] + [[package]] name = "integer-encoding" version = "3.0.4" @@ -2620,6 +2687,30 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "jsonwebtoken" +version = "9.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" +dependencies = [ + "base64", + "js-sys", + "pem", + "ring", + "serde", + "serde_json", + "simple_asn1", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + [[package]] name = "lexical-core" version = "1.0.6" @@ -2860,6 +2951,22 @@ dependencies = [ "serde", ] +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + [[package]] name = "num-complex" version = "0.4.6" @@ -2884,6 +2991,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -3062,6 +3180,35 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64", + "serde_core", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -3110,6 +3257,44 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs5" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e847e2c91a18bfa887dd028ec33f2fe6f25db77db3619024764914affe8b69a6" +dependencies = [ + "aes", + "cbc", + "der", + "pbkdf2", + "scrypt", + "sha2", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "pkcs5", + "rand_core 0.6.4", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.32" @@ -3545,11 +3730,14 @@ dependencies = [ "hmac", "home", "http", + "jsonwebtoken", "log", + "once_cell", "percent-encoding", "quick-xml 0.37.5", "rand 0.8.5", "reqwest", + "rsa", "rust-ini", "serde", "serde_json", @@ -3623,6 +3811,27 @@ dependencies = [ "byteorder", ] +[[package]] +name = "rsa" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "sha2", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rust-ini" version = "0.21.3" @@ -3687,9 +3896,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.7" +version = "0.103.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" +checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" dependencies = [ "ring", "rustls-pki-types", @@ -3708,6 +3917,15 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + [[package]] name = "same-file" version = "1.0.6" @@ -3747,6 +3965,17 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "scrypt" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" +dependencies = [ + "pbkdf2", + "salsa20", + "sha2", +] + [[package]] name = "semver" version = "1.0.27" @@ -3903,6 +4132,16 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -3915,6 +4154,18 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" +[[package]] +name = "simple_asn1" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror", + "time", +] + [[package]] name = "siphasher" version = "1.0.1" @@ -3949,6 +4200,22 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "sqlparser" version = "0.59.0" From afd02c101bf63e72d843167810d9ef5602c996d6 Mon Sep 17 00:00:00 2001 From: blackmwk Date: Wed, 15 Apr 2026 10:30:19 -0700 Subject: [PATCH 08/23] Fix RUSTSEC-2026-0097 (#2331) ## Which issue does this PR close? - Closes #2327 #2328 #2329 ## What changes are included in this PR? Upgrade rnd version, use recommended api. ## Are these changes tested? ut. (cherry picked from commit 3fe7be196cae9e119747de3bc3fcae5818e2e9b0) --- .cargo/audit.toml | 5 ++ Cargo.lock | 50 ++++++++++++------- Cargo.toml | 2 +- .../src/expr/visitors/page_index_evaluator.rs | 6 +-- .../visitors/row_group_metrics_evaluator.rs | 6 +-- .../src/writer/file_writer/rolling_writer.rs | 2 +- 6 files changed, 44 insertions(+), 27 deletions(-) diff --git a/.cargo/audit.toml b/.cargo/audit.toml index 09e2d35c50..71354ea3a5 100644 --- a/.cargo/audit.toml +++ b/.cargo/audit.toml @@ -33,4 +33,9 @@ ignore = [ # # Introduced by object_store, see https://github.com/apache/arrow-rs-object-store/issues/564 "RUSTSEC-2025-0134", + # `rand` unsoundness with custom logger using `rand::rng()` + # + # Direct dependency upgraded to 0.9.3+. Transitive rand 0.8.5 remains + # from reqsign/sqllogictest/rustc-hash — no 0.8.x patch exists. + "RUSTSEC-2026-0097", ] diff --git a/Cargo.lock b/Cargo.lock index cf3a587351..bb666f9372 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -145,7 +145,7 @@ dependencies = [ "miniz_oxide", "num-bigint", "quad-rand", - "rand 0.9.2", + "rand 0.9.4", "regex-lite", "serde", "serde_bytes", @@ -1694,7 +1694,7 @@ dependencies = [ "object_store", "parking_lot", "parquet", - "rand 0.9.2", + "rand 0.9.4", "regex", "sqlparser", "tempfile", @@ -1845,7 +1845,7 @@ dependencies = [ "liblzma", "log", "object_store", - "rand 0.9.2", + "rand 0.9.4", "tokio", "tokio-util", "url", @@ -1994,7 +1994,7 @@ dependencies = [ "object_store", "parking_lot", "parquet", - "rand 0.9.2", + "rand 0.9.4", "tempfile", "url", ] @@ -2059,7 +2059,7 @@ dependencies = [ "log", "md-5", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "regex", "sha2", "unicode-segmentation", @@ -2353,7 +2353,8 @@ dependencies = [ "datafusion-functions-nested", "log", "percent-encoding", - "rand 0.9.2", + "rand 0.9.4", + "serde_json", "sha1", "url", ] @@ -3277,7 +3278,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.2", + "socket2 0.6.3", "tokio", "tower-service", "tracing", @@ -3345,7 +3346,7 @@ dependencies = [ "ordered-float 4.6.0", "parquet", "pretty_assertions", - "rand 0.8.5", + "rand 0.9.4", "regex", "reqwest", "roaring", @@ -4251,7 +4252,7 @@ dependencies = [ "hyper-util", "log", "pin-project-lite", - "rand 0.9.2", + "rand 0.9.4", "regex", "serde_json", "serde_urlencoded", @@ -4506,8 +4507,8 @@ dependencies = [ "md-5", "parking_lot", "percent-encoding", - "quick-xml 0.38.4", - "rand 0.9.2", + "quick-xml 0.39.2", + "rand 0.10.1", "reqwest", "ring", "rustls-pemfile", @@ -5120,7 +5121,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.6.2", + "socket2 0.6.3", "thiserror 2.0.18", "tokio", "tracing", @@ -5136,7 +5137,7 @@ dependencies = [ "bytes", "getrandom 0.3.4", "lru-slab", - "rand 0.9.2", + "rand 0.9.4", "ring", "rustc-hash", "rustls", @@ -5157,7 +5158,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.2", + "socket2 0.6.3", "tracing", "windows-sys 0.60.2", ] @@ -5210,14 +5211,25 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", ] +[[package]] +name = "rand" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +dependencies = [ + "chacha20", + "getrandom 0.4.2", + "rand_core 0.10.0", +] + [[package]] name = "rand_chacha" version = "0.3.1" @@ -5615,9 +5627,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.10" +version = "0.103.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" +checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06" dependencies = [ "aws-lc-rs", "ring", @@ -7167,7 +7179,7 @@ dependencies = [ "nix 0.29.0", "once_cell", "pin-project", - "rand 0.9.2", + "rand 0.9.4", "socket2 0.5.10", "thiserror 2.0.18", "tokio", diff --git a/Cargo.toml b/Cargo.toml index 8ef6feeabe..62834f1e9b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -106,7 +106,7 @@ ordered-float = "4" parquet = "57.1" pilota = "0.11.10" pretty_assertions = "1.4" -rand = "0.8.5" +rand = "0.9.3" regex = "1.11.3" reqwest = { version = "0.12.12", default-features = false, features = ["json"] } roaring = { version = "0.11" } diff --git a/crates/iceberg/src/expr/visitors/page_index_evaluator.rs b/crates/iceberg/src/expr/visitors/page_index_evaluator.rs index 66e2898532..07ee49b44c 100644 --- a/crates/iceberg/src/expr/visitors/page_index_evaluator.rs +++ b/crates/iceberg/src/expr/visitors/page_index_evaluator.rs @@ -793,7 +793,7 @@ mod tests { }; use parquet::file::metadata::ParquetMetaData; use parquet::file::properties::WriterProperties; - use rand::{Rng, thread_rng}; + use rand::Rng; use tempfile::NamedTempFile; use super::PageIndexEvaluator; @@ -1284,13 +1284,13 @@ mod tests { #[test] fn eval_in_length_of_set_above_limit_all_rows() -> Result<()> { - let mut rng = thread_rng(); + let mut rng = rand::rng(); let (metadata, _temp_file) = create_test_parquet_file()?; let (column_index, offset_index, row_group_metadata) = get_test_metadata(&metadata); let (iceberg_schema_ref, field_id_map) = build_iceberg_schema_and_field_map()?; let filter = Reference::new("col_float") - .is_in(std::iter::repeat_with(|| Datum::float(rng.gen_range(0.0..10.0))).take(1000)) + .is_in(std::iter::repeat_with(|| Datum::float(rng.random_range(0.0..10.0))).take(1000)) .bind(iceberg_schema_ref.clone(), false)?; let result = PageIndexEvaluator::eval( diff --git a/crates/iceberg/src/expr/visitors/row_group_metrics_evaluator.rs b/crates/iceberg/src/expr/visitors/row_group_metrics_evaluator.rs index 0506b33af0..ad7e19f548 100644 --- a/crates/iceberg/src/expr/visitors/row_group_metrics_evaluator.rs +++ b/crates/iceberg/src/expr/visitors/row_group_metrics_evaluator.rs @@ -528,7 +528,7 @@ mod tests { use parquet::schema::types::{ ColumnDescriptor, ColumnPath, SchemaDescriptor, Type as parquetSchemaType, }; - use rand::{Rng, thread_rng}; + use rand::Rng; use super::RowGroupMetricsEvaluator; use crate::Result; @@ -1617,7 +1617,7 @@ mod tests { #[test] fn eval_true_for_too_many_literals_filter_is_in() -> Result<()> { - let mut rng = thread_rng(); + let mut rng = rand::rng(); let row_group_metadata = create_row_group_metadata( 1, @@ -1636,7 +1636,7 @@ mod tests { let (iceberg_schema_ref, field_id_map) = build_iceberg_schema_and_field_map()?; let filter = Reference::new("col_float") - .is_in(std::iter::repeat_with(|| Datum::float(rng.gen_range(0.0..10.0))).take(1000)) + .is_in(std::iter::repeat_with(|| Datum::float(rng.random_range(0.0..10.0))).take(1000)) .bind(iceberg_schema_ref.clone(), false)?; let result = RowGroupMetricsEvaluator::eval( diff --git a/crates/iceberg/src/writer/file_writer/rolling_writer.rs b/crates/iceberg/src/writer/file_writer/rolling_writer.rs index b86f6a2ea7..b0b2d2f191 100644 --- a/crates/iceberg/src/writer/file_writer/rolling_writer.rs +++ b/crates/iceberg/src/writer/file_writer/rolling_writer.rs @@ -399,7 +399,7 @@ mod tests { "Kelly", "Larry", "Mallory", "Shawn", ]; - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); let batch_num = 10; let batch_rows = 100; let expected_rows = batch_num * batch_rows; From fb0ee591d509780a9aa0df3248000a742941b78a Mon Sep 17 00:00:00 2001 From: Shawn Chang Date: Fri, 17 Apr 2026 15:54:40 -0700 Subject: [PATCH 09/23] update Cargo.lock --- Cargo.lock | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bb666f9372..42be4ebb0a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2354,7 +2354,6 @@ dependencies = [ "log", "percent-encoding", "rand 0.9.4", - "serde_json", "sha1", "url", ] @@ -3278,7 +3277,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.3", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -4110,9 +4109,9 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "lz4_flex" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab6473172471198271ff72e9379150e9dfd70d8e533e0752a27e515b48dd375e" +checksum = "98c23545df7ecf1b16c303910a69b079e8e251d60f7dd2cc9b4177f2afaf1746" dependencies = [ "twox-hash", ] @@ -4507,8 +4506,8 @@ dependencies = [ "md-5", "parking_lot", "percent-encoding", - "quick-xml 0.39.2", - "rand 0.10.1", + "quick-xml 0.38.4", + "rand 0.9.4", "reqwest", "ring", "rustls-pemfile", @@ -5121,7 +5120,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.6.3", + "socket2 0.5.10", "thiserror 2.0.18", "tokio", "tracing", @@ -5158,7 +5157,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.3", + "socket2 0.5.10", "tracing", "windows-sys 0.60.2", ] @@ -5219,17 +5218,6 @@ dependencies = [ "rand_core 0.9.5", ] -[[package]] -name = "rand" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" -dependencies = [ - "chacha20", - "getrandom 0.4.2", - "rand_core 0.10.0", -] - [[package]] name = "rand_chacha" version = "0.3.1" From 9db6836ed4858e2a38e3e88e04d95fa5095d678e Mon Sep 17 00:00:00 2001 From: Shawn Chang Date: Wed, 22 Apr 2026 15:21:38 -0700 Subject: [PATCH 10/23] revert serde_arrow to arrow-57 for 0.9.1 --- Cargo.lock | 171 ++++++++++++++------------------------ crates/iceberg/Cargo.toml | 2 +- 2 files changed, 62 insertions(+), 111 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 42be4ebb0a..c34068d13d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -192,16 +192,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4754a624e5ae42081f464514be454b39711daae0458906dacde5f4c632f33a8" dependencies = [ "arrow-arith", - "arrow-array 57.3.0", - "arrow-buffer 57.3.0", + "arrow-array", + "arrow-buffer", "arrow-cast", "arrow-csv", - "arrow-data 57.3.0", + "arrow-data", "arrow-ipc", "arrow-json", "arrow-ord", "arrow-row", - "arrow-schema 57.3.0", + "arrow-schema", "arrow-select", "arrow-string", ] @@ -212,10 +212,10 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7b3141e0ec5145a22d8694ea8b6d6f69305971c4fa1c1a13ef0195aef2d678b" dependencies = [ - "arrow-array 57.3.0", - "arrow-buffer 57.3.0", - "arrow-data 57.3.0", - "arrow-schema 57.3.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "chrono", "num-traits", ] @@ -227,9 +227,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c8955af33b25f3b175ee10af580577280b4bd01f7e823d94c7cdef7cf8c9aef" dependencies = [ "ahash", - "arrow-buffer 57.3.0", - "arrow-data 57.3.0", - "arrow-schema 57.3.0", + "arrow-buffer", + "arrow-data", + "arrow-schema", "chrono", "chrono-tz", "half", @@ -239,24 +239,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "arrow-array" -version = "58.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "772bd34cacdda8baec9418d80d23d0fb4d50ef0735685bd45158b83dfeb6e62d" -dependencies = [ - "ahash", - "arrow-buffer 58.1.0", - "arrow-data 58.1.0", - "arrow-schema 58.1.0", - "chrono", - "half", - "hashbrown 0.16.1", - "num-complex", - "num-integer", - "num-traits", -] - [[package]] name = "arrow-buffer" version = "57.3.0" @@ -269,29 +251,17 @@ dependencies = [ "num-traits", ] -[[package]] -name = "arrow-buffer" -version = "58.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "898f4cf1e9598fdb77f356fdf2134feedfd0ee8d5a4e0a5f573e7d0aec16baa4" -dependencies = [ - "bytes", - "half", - "num-bigint", - "num-traits", -] - [[package]] name = "arrow-cast" version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "646bbb821e86fd57189c10b4fcdaa941deaf4181924917b0daa92735baa6ada5" dependencies = [ - "arrow-array 57.3.0", - "arrow-buffer 57.3.0", - "arrow-data 57.3.0", + "arrow-array", + "arrow-buffer", + "arrow-data", "arrow-ord", - "arrow-schema 57.3.0", + "arrow-schema", "arrow-select", "atoi", "base64", @@ -309,9 +279,9 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da746f4180004e3ce7b83c977daf6394d768332349d3d913998b10a120b790a" dependencies = [ - "arrow-array 57.3.0", + "arrow-array", "arrow-cast", - "arrow-schema 57.3.0", + "arrow-schema", "chrono", "csv", "csv-core", @@ -324,21 +294,8 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fdd994a9d28e6365aa78e15da3f3950c0fdcea6b963a12fa1c391afb637b304" dependencies = [ - "arrow-buffer 57.3.0", - "arrow-schema 57.3.0", - "half", - "num-integer", - "num-traits", -] - -[[package]] -name = "arrow-data" -version = "58.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d10beeab2b1c3bb0b53a00f7c944a178b622173a5c7bcabc3cb45d90238df4" -dependencies = [ - "arrow-buffer 58.1.0", - "arrow-schema 58.1.0", + "arrow-buffer", + "arrow-schema", "half", "num-integer", "num-traits", @@ -350,10 +307,10 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abf7df950701ab528bf7c0cf7eeadc0445d03ef5d6ffc151eaae6b38a58feff1" dependencies = [ - "arrow-array 57.3.0", - "arrow-buffer 57.3.0", - "arrow-data 57.3.0", - "arrow-schema 57.3.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "arrow-select", "flatbuffers", "lz4_flex", @@ -366,11 +323,11 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ff8357658bedc49792b13e2e862b80df908171275f8e6e075c460da5ee4bf86" dependencies = [ - "arrow-array 57.3.0", - "arrow-buffer 57.3.0", + "arrow-array", + "arrow-buffer", "arrow-cast", - "arrow-data 57.3.0", - "arrow-schema 57.3.0", + "arrow-data", + "arrow-schema", "chrono", "half", "indexmap 2.13.0", @@ -390,10 +347,10 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d8f1870e03d4cbed632959498bcc84083b5a24bded52905ae1695bd29da45b" dependencies = [ - "arrow-array 57.3.0", - "arrow-buffer 57.3.0", - "arrow-data 57.3.0", - "arrow-schema 57.3.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "arrow-select", ] @@ -403,10 +360,10 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18228633bad92bff92a95746bbeb16e5fc318e8382b75619dec26db79e4de4c0" dependencies = [ - "arrow-array 57.3.0", - "arrow-buffer 57.3.0", - "arrow-data 57.3.0", - "arrow-schema 57.3.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "half", ] @@ -420,12 +377,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "arrow-schema" -version = "58.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c30a1365d7a7dc50cc847e54154e6af49e4c4b0fddc9f607b687f29212082743" - [[package]] name = "arrow-select" version = "57.3.0" @@ -433,10 +384,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68bf3e3efbd1278f770d67e5dc410257300b161b93baedb3aae836144edcaf4b" dependencies = [ "ahash", - "arrow-array 57.3.0", - "arrow-buffer 57.3.0", - "arrow-data 57.3.0", - "arrow-schema 57.3.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "num-traits", ] @@ -446,10 +397,10 @@ version = "57.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85e968097061b3c0e9fe3079cf2e703e487890700546b5b0647f60fca1b5a8d8" dependencies = [ - "arrow-array 57.3.0", - "arrow-buffer 57.3.0", - "arrow-data 57.3.0", - "arrow-schema 57.3.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "arrow-select", "memchr", "num-traits", @@ -1655,7 +1606,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "503f1f4a9060ae6e650d3dff5dc7a21266fea1302d890768d45b4b28586e830f" dependencies = [ "arrow", - "arrow-schema 57.3.0", + "arrow-schema", "async-trait", "bytes", "bzip2", @@ -2042,7 +1993,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "189256495dc9cbbb8e20dbcf161f60422e628d201a78df8207e44bd4baefadb6" dependencies = [ "arrow", - "arrow-buffer 57.3.0", + "arrow-buffer", "base64", "blake2", "blake3", @@ -2282,7 +2233,7 @@ dependencies = [ "ahash", "arrow", "arrow-ord", - "arrow-schema 57.3.0", + "arrow-schema", "async-trait", "datafusion-common", "datafusion-common-runtime", @@ -3315,11 +3266,11 @@ dependencies = [ "apache-avro", "array-init", "arrow-arith", - "arrow-array 57.3.0", - "arrow-buffer 57.3.0", + "arrow-array", + "arrow-buffer", "arrow-cast", "arrow-ord", - "arrow-schema 57.3.0", + "arrow-schema", "arrow-select", "arrow-string", "as-any", @@ -3511,8 +3462,8 @@ dependencies = [ name = "iceberg-integration-tests" version = "0.9.0" dependencies = [ - "arrow-array 57.3.0", - "arrow-schema 57.3.0", + "arrow-array", + "arrow-schema", "futures", "iceberg", "iceberg-catalog-rest", @@ -4122,10 +4073,10 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5240d6977234968ff9ad254bfa73aa397fb51e41dcb22b1eb85835e9295485b" dependencies = [ - "arrow-array 58.1.0", - "arrow-buffer 58.1.0", - "arrow-data 58.1.0", - "arrow-schema 58.1.0", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", "bytemuck", "half", "serde", @@ -4654,12 +4605,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ee96b29972a257b855ff2341b37e61af5f12d6af1158b6dcdb5b31ea07bb3cb" dependencies = [ "ahash", - "arrow-array 57.3.0", - "arrow-buffer 57.3.0", + "arrow-array", + "arrow-buffer", "arrow-cast", - "arrow-data 57.3.0", + "arrow-data", "arrow-ipc", - "arrow-schema 57.3.0", + "arrow-schema", "arrow-select", "base64", "brotli", @@ -5815,8 +5766,8 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2784e59a0315568e850cb01ddadf458f8c09e28d8cfc4880c2cc08f5dc3444e0" dependencies = [ - "arrow-array 58.1.0", - "arrow-schema 58.1.0", + "arrow-array", + "arrow-schema", "bytemuck", "chrono", "half", diff --git a/crates/iceberg/Cargo.toml b/crates/iceberg/Cargo.toml index b8e19472cd..a8836210ff 100644 --- a/crates/iceberg/Cargo.toml +++ b/crates/iceberg/Cargo.toml @@ -89,7 +89,7 @@ rand = { workspace = true } regex = { workspace = true } tempfile = { workspace = true } minijinja = { workspace = true } -serde_arrow = { version = "0.14", features = ["arrow-58"] } +serde_arrow = { version = "0.14", features = ["arrow-57"] } [package.metadata.cargo-machete] # These dependencies are added to ensure minimal dependency version From 7d46eaacb436819f9b05f6451d38bec1212b320b Mon Sep 17 00:00:00 2001 From: Shawn Chang Date: Wed, 18 Mar 2026 18:11:47 -0700 Subject: [PATCH 11/23] chore: Change publish parallism back to 1 (#2254) ## Which issue does this PR close? - publish has to be done one by one, otherwise we may see failure like this: https://github.com/apache/iceberg-rust/actions/runs/23260056698 ## What changes are included in this PR? - Change publish parallism back to 1 ## Are these changes tested? (cherry picked from commit 7db4b018153f1eaefd10e1b62720c5f8cb292692) --- .github/workflows/publish.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c1c9046154..26f61118b7 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -33,8 +33,7 @@ jobs: publish: runs-on: ubuntu-latest strategy: - # Publish package one by one instead of flooding the registry - max-parallel: 15 + max-parallel: 1 # Publish package one by one instead of flooding the registry matrix: # Order here is sensitive, as it will be used to determine the order of publishing package: From c4ca1afd9cc9dec77e1f06047154b3422191132a Mon Sep 17 00:00:00 2001 From: Kevin Liu Date: Tue, 31 Mar 2026 02:43:39 -0700 Subject: [PATCH 12/23] ci: fix zizmor security findings (#2290) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Which issue does this PR close? Relates to https://github.com/apache/iceberg/issues/15742 Follow up to #2289 ## What changes are included in this PR? Fix github workflow based on zizmor recommendation for security best practice ## Are these changes tested? Yes ``` ➜ iceberg-rust git:(kevinjqliu/zizmor-fix) uvx --from zizmor zizmor --offline .github/ 🌈 zizmor v1.23.1 INFO audit: zizmor: 🌈 completed .github/actions/get-msrv/action.yml INFO audit: zizmor: 🌈 completed .github/actions/overwrite-package-version/action.yml INFO audit: zizmor: 🌈 completed .github/actions/setup-builder/action.yml INFO audit: zizmor: 🌈 completed .github/dependabot.yml INFO audit: zizmor: 🌈 completed .github/workflows/audit.yml INFO audit: zizmor: 🌈 completed .github/workflows/bindings_python_ci.yml INFO audit: zizmor: 🌈 completed .github/workflows/ci.yml INFO audit: zizmor: 🌈 completed .github/workflows/ci_typos.yml INFO audit: zizmor: 🌈 completed .github/workflows/codeql.yml INFO audit: zizmor: 🌈 completed .github/workflows/publish.yml INFO audit: zizmor: 🌈 completed .github/workflows/release_python.yml INFO audit: zizmor: 🌈 completed .github/workflows/release_python_nightly.yml INFO audit: zizmor: 🌈 completed .github/workflows/stale.yml INFO audit: zizmor: 🌈 completed .github/workflows/website.yml No findings to report. Good job! (1 ignored, 37 suppressed) ``` (cherry picked from commit 6ee5e71b04dad06183655d4fae4f28635541a072) --- .../overwrite-package-version/action.yml | 2 +- .github/workflows/audit.yml | 6 +- .github/workflows/bindings_python_ci.yml | 20 ++++-- .github/workflows/ci.yml | 38 +++++++---- .github/workflows/ci_typos.yml | 6 +- .github/workflows/codeql.yml | 8 ++- .github/workflows/publish.yml | 19 +++++- .github/workflows/release_python.yml | 66 +++++++++---------- .github/workflows/release_python_nightly.yml | 22 ++++--- .github/workflows/stale.yml | 2 +- .github/workflows/website.yml | 10 +-- .github/workflows/zizmor.yml | 44 +++++++++++++ 12 files changed, 163 insertions(+), 80 deletions(-) create mode 100644 .github/workflows/zizmor.yml diff --git a/.github/actions/overwrite-package-version/action.yml b/.github/actions/overwrite-package-version/action.yml index 8a2739456e..aed736ecf9 100644 --- a/.github/actions/overwrite-package-version/action.yml +++ b/.github/actions/overwrite-package-version/action.yml @@ -25,7 +25,7 @@ runs: using: "composite" steps: - name: Setup Python - uses: actions/setup-python@v5 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 with: python-version: '3.12' diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml index abe0c377c5..68731cbed3 100644 --- a/.github/workflows/audit.yml +++ b/.github/workflows/audit.yml @@ -44,11 +44,13 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'apache/iceberg-rust' steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - name: Setup Rust toolchain uses: ./.github/actions/setup-builder with: rust-version: stable - - uses: rustsec/audit-check@v2.0.0 + - uses: rustsec/audit-check@69366f33c96575abad1ee0dba8212993eecbe998 # v2.0.0 with: token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/bindings_python_ci.yml b/.github/workflows/bindings_python_ci.yml index efd4a78098..a7abfcbeed 100644 --- a/.github/workflows/bindings_python_ci.yml +++ b/.github/workflows/bindings_python_ci.yml @@ -47,7 +47,9 @@ jobs: check-rust: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - name: Check format working-directory: "bindings/python" run: cargo fmt --all -- --check @@ -58,8 +60,10 @@ jobs: check-python: runs-on: ubuntu-slim steps: - - uses: actions/checkout@v6 - - uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false + - uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1 with: version: "0.9.3" enable-cache: true @@ -85,16 +89,18 @@ jobs: - macos-latest - windows-latest steps: - - uses: actions/checkout@v6 - - uses: actions/setup-python@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 with: python-version: 3.12 - - uses: PyO3/maturin-action@v1 + - uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1 with: working-directory: "bindings/python" command: build args: --out dist -i python3.12 # Explicitly set interpreter; manylinux containers have multiple Pythons and maturin may pick an older one - - uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 + - uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1 with: version: "0.9.3" enable-cache: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ea2257b676..63ee893fa2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,19 +53,21 @@ jobs: - ubuntu-latest - macos-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - name: Setup Rust toolchain uses: ./.github/actions/setup-builder - name: Check License Header - uses: apache/skywalking-eyes/header@v0.8.0 + uses: apache/skywalking-eyes/header@61275cc80d0798a405cb070f7d3a8aaf7cf2c2c1 # v0.8.0 - name: Check toml format run: make check-toml - name: Install protoc - uses: arduino/setup-protoc@v3 + uses: arduino/setup-protoc@c65c819552d16ad3c9b72d9dfd5ba5237b9c906b # v3 with: repo-token: ${{ secrets.GITHUB_TOKEN }} @@ -91,16 +93,18 @@ jobs: - macos-latest - windows-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - name: Setup Rust toolchain uses: ./.github/actions/setup-builder - name: Cache Rust artifacts - uses: Swatinem/rust-cache@v2 + uses: swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 - name: Install protoc - uses: arduino/setup-protoc@v3 + uses: arduino/setup-protoc@c65c819552d16ad3c9b72d9dfd5ba5237b9c906b # v3 with: repo-token: ${{ secrets.GITHUB_TOKEN }} @@ -117,13 +121,15 @@ jobs: - macos-latest - windows-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - name: Setup Rust toolchain uses: ./.github/actions/setup-builder - name: Cache Rust artifacts - uses: Swatinem/rust-cache@v2 + uses: swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 - name: Build run: cargo build -p iceberg --no-default-features @@ -138,24 +144,26 @@ jobs: - { name: "doc", args: "--doc --all-features --workspace" } name: Tests (${{ matrix.test-suite.name }}) steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - name: Setup Rust toolchain uses: ./.github/actions/setup-builder - name: Install protoc - uses: arduino/setup-protoc@v3 + uses: arduino/setup-protoc@c65c819552d16ad3c9b72d9dfd5ba5237b9c906b # v3 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Cache Rust artifacts - uses: Swatinem/rust-cache@v2 + uses: swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 with: key: ${{ matrix.test-suite.name }} - name: Install cargo-nextest if: matrix.test-suite.name == 'default' - uses: taiki-e/install-action@v2 + uses: taiki-e/install-action@0fde6d128a3d980ceac30be8c8b8739abd963b81 # v2.70.0 with: tool: cargo-nextest @@ -182,9 +190,11 @@ jobs: name: Verify MSRV runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - name: Install protoc - uses: arduino/setup-protoc@v3 + uses: arduino/setup-protoc@c65c819552d16ad3c9b72d9dfd5ba5237b9c906b # v3 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Get MSRV diff --git a/.github/workflows/ci_typos.yml b/.github/workflows/ci_typos.yml index 8031cd8ca9..9373c7295d 100644 --- a/.github/workflows/ci_typos.yml +++ b/.github/workflows/ci_typos.yml @@ -43,6 +43,8 @@ jobs: env: FORCE_COLOR: 1 steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - name: Check typos - uses: crate-ci/typos@v1.44.0 + uses: crate-ci/typos@631208b7aac2daa8b707f55e7331f9112b0e062d # v1.44.0 diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 17bfd8bf3d..81bc6b16f8 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -41,14 +41,16 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - name: Initialize CodeQL - uses: github/codeql-action/init@v4 + uses: github/codeql-action/init@c10b8064de6f491fea524254123dbe5e09572f13 # v4 with: languages: actions - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v4 + uses: github/codeql-action/analyze@c10b8064de6f491fea524254123dbe5e09572f13 # v4 with: category: "/language:actions" diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 26f61118b7..d6ba35d9f4 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -32,6 +32,7 @@ permissions: jobs: publish: runs-on: ubuntu-latest + environment: publish strategy: max-parallel: 1 # Publish package one by one instead of flooding the registry matrix: @@ -46,7 +47,9 @@ jobs: - "crates/catalog/sql" - "crates/integrations/datafusion" steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - name: Get MSRV id: get-msrv @@ -61,6 +64,18 @@ jobs: working-directory: ${{ matrix.package }} # Only publish if it's a tag and the tag is not a pre-release if: ${{ startsWith(github.ref, 'refs/tags/') && !contains(github.ref, '-') }} - run: cargo publish --all-features + run: cargo publish --all-features # zizmor: ignore[use-trusted-publishing] -- https://github.com/apache/iceberg-rust/issues/1539 env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + + # Trigger Python release after crate publishing completes. + # Only runs for tag pushes; for manual Python releases, use workflow_dispatch on release_python.yml directly. + release-python: + needs: [publish] + if: ${{ startsWith(github.ref, 'refs/tags/') }} + permissions: + contents: read + id-token: write # Required for PyPI trusted publishing in the called workflow + uses: ./.github/workflows/release_python.yml + with: + release_tag: ${{ github.ref_name }} diff --git a/.github/workflows/release_python.yml b/.github/workflows/release_python.yml index abf8b52b6d..d9fcdd406b 100644 --- a/.github/workflows/release_python.yml +++ b/.github/workflows/release_python.yml @@ -18,10 +18,12 @@ name: Publish Python 🐍 distribution 📦 to PyPI on: - workflow_run: - workflows: ["Publish"] # Trigger this workflow after the "publish.yml" workflow completes - types: - - completed + workflow_call: + inputs: + release_tag: + description: 'Release tag (e.g., v0.4.0 or v0.4.0-rc.1)' + required: true + type: string workflow_dispatch: inputs: release_tag: @@ -33,37 +35,23 @@ permissions: contents: read jobs: - check-cargo-publish: - runs-on: ubuntu-latest - # Only run if the triggering workflow succeeded OR if manually triggered - if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' }} - steps: - - run: echo 'The Publish workflow passed or was manually triggered' - validate-release-tag: runs-on: ubuntu-latest - needs: [check-cargo-publish] outputs: cargo-version: ${{ steps.validate.outputs.cargo-version }} is-rc: ${{ steps.validate.outputs.is-rc }} steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 if: ${{ github.event_name == 'workflow_dispatch' }} + with: + persist-credentials: false - name: Validate release tag format id: validate - # Use input for workflow_dispatch, otherwise use `workflow_run.head_branch` - # Note, `workflow_run.head_branch` does not contain `refs/tags/` prefix, just the tag name, i.e. `v0.4.0` or `v0.4.0-rc.1` # Valid formats: v.. OR v..-rc. env: - DISPATCH_RELEASE_TAG: ${{ github.event.inputs.release_tag }} - RUN_HEAD_BRANCH: ${{ github.event.workflow_run.head_branch }} + RELEASE_TAG: ${{ inputs.release_tag }} run: | - if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then - RELEASE_TAG="$DISPATCH_RELEASE_TAG" - else - RELEASE_TAG="$RUN_HEAD_BRANCH" - fi echo "Validating release tag: $RELEASE_TAG" if [[ ! "$RELEASE_TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-rc\.[0-9]+)?$ ]]; then echo "❌ Invalid release tag format: $RELEASE_TAG" @@ -114,7 +102,9 @@ jobs: runs-on: ubuntu-latest needs: [validate-release-tag] steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - name: Install toml-cli if: ${{ needs.validate-release-tag.outputs.is-rc == 'true' }} @@ -124,19 +114,21 @@ jobs: if: ${{ needs.validate-release-tag.outputs.is-rc == 'true' }} working-directory: "bindings/python" run: | - echo "Setting cargo version to: ${{ needs.validate-release-tag.outputs.cargo-version }}" - toml set Cargo.toml package.version ${{ needs.validate-release-tag.outputs.cargo-version }} > Cargo.toml.tmp + echo "Setting cargo version to: ${NEEDS_VALIDATE_RELEASE_TAG_OUTPUTS_CARGO_VERSION}" + toml set Cargo.toml package.version "${NEEDS_VALIDATE_RELEASE_TAG_OUTPUTS_CARGO_VERSION}" > Cargo.toml.tmp # doing this explicitly to avoid issue in Windows where `mv` does not overwrite existing file rm Cargo.toml mv Cargo.toml.tmp Cargo.toml + env: + NEEDS_VALIDATE_RELEASE_TAG_OUTPUTS_CARGO_VERSION: ${{ needs.validate-release-tag.outputs.cargo-version }} - - uses: PyO3/maturin-action@v1 + - uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1 with: working-directory: "bindings/python" command: sdist args: -o dist - name: Upload sdist - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 with: name: wheels-sdist path: bindings/python/dist @@ -158,7 +150,9 @@ jobs: } - { os: ubuntu-latest, target: "armv7l" } steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - name: Install toml-cli if: ${{ needs.validate-release-tag.outputs.is-rc == 'true' }} @@ -167,14 +161,16 @@ jobs: - name: Set cargo version for RC if: ${{ needs.validate-release-tag.outputs.is-rc == 'true' }} working-directory: "bindings/python" + env: + CARGO_VERSION: ${{ needs.validate-release-tag.outputs.cargo-version }} run: | - echo "Setting cargo version to: ${{ needs.validate-release-tag.outputs.cargo-version }}" - toml set Cargo.toml package.version ${{ needs.validate-release-tag.outputs.cargo-version }} > Cargo.toml.tmp + echo "Setting cargo version to: $CARGO_VERSION" + toml set Cargo.toml package.version "$CARGO_VERSION" > Cargo.toml.tmp # doing this explicitly to avoid issue in Windows where `mv` does not overwrite existing file rm Cargo.toml mv Cargo.toml.tmp Cargo.toml - - uses: actions/setup-python@v6 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 with: python-version: 3.12 - name: Get MSRV @@ -185,7 +181,7 @@ jobs: uses: ./.github/actions/setup-builder with: rust-version: ${{ steps.get-msrv.outputs.msrv }} - - uses: PyO3/maturin-action@v1 + - uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1 with: target: ${{ matrix.target }} manylinux: ${{ matrix.manylinux || 'auto' }} @@ -193,7 +189,7 @@ jobs: command: build args: --release -o dist -i python3.12 # Explicitly set interpreter; manylinux containers have multiple Pythons and maturin may pick an older one - name: Upload wheels - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 with: name: wheels-${{ matrix.os }}-${{ matrix.target }} path: bindings/python/dist @@ -212,13 +208,13 @@ jobs: steps: - name: Download all the dists - uses: actions/download-artifact@v8 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 with: pattern: wheels-* merge-multiple: true path: bindings/python/dist - name: Publish to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 + uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0 with: skip-existing: true packages-dir: bindings/python/dist diff --git a/.github/workflows/release_python_nightly.yml b/.github/workflows/release_python_nightly.yml index 595cb42d05..86e589acd6 100644 --- a/.github/workflows/release_python_nightly.yml +++ b/.github/workflows/release_python_nightly.yml @@ -40,20 +40,22 @@ jobs: if: github.repository == 'apache/iceberg-rust' # Only run for apache repo runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - uses: ./.github/actions/overwrite-package-version # Overwrite package version with timestamp with: timestamp: ${{ needs.set-version.outputs.TIMESTAMP }} - - uses: PyO3/maturin-action@v1 + - uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1 with: working-directory: "bindings/python" command: sdist args: -o dist - name: Upload sdist - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 with: name: wheels-sdist path: bindings/python/dist @@ -76,13 +78,15 @@ jobs: } - { os: ubuntu-latest, target: "armv7l" } steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - uses: ./.github/actions/overwrite-package-version # Overwrite package version with timestamp with: timestamp: ${{ needs.set-version.outputs.TIMESTAMP }} - - uses: actions/setup-python@v6 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 with: python-version: 3.12 @@ -95,7 +99,7 @@ jobs: with: rust-version: ${{ steps.get-msrv.outputs.msrv }} - - uses: PyO3/maturin-action@v1 + - uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1 with: target: ${{ matrix.target }} manylinux: ${{ matrix.manylinux || 'auto' }} @@ -104,7 +108,7 @@ jobs: args: --release -o dist -i python3.12 # Explicitly set interpreter; manylinux containers have multiple Pythons and maturin may pick an older one - name: Upload wheels - uses: actions/upload-artifact@v7 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 with: name: wheels-${{ matrix.os }}-${{ matrix.target }} path: bindings/python/dist @@ -122,7 +126,7 @@ jobs: steps: - name: Download all the dists - uses: actions/download-artifact@v8 + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 with: pattern: wheels-* merge-multiple: true @@ -132,7 +136,7 @@ jobs: - name: Publish to TestPyPI id: publish-testpypi continue-on-error: true - uses: pypa/gh-action-pypi-publish@release/v1 + uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0 with: repository-url: https://test.pypi.org/legacy/ skip-existing: true diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index e2afce4c71..c3d3f18294 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -32,7 +32,7 @@ jobs: if: github.repository_owner == 'apache' runs-on: ubuntu-24.04 steps: - - uses: actions/stale@v10.2.0 + - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # v10.2.0 with: # stale issues stale-issue-label: 'stale,security' diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index 59bd2c6f2c..71fb9503c9 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -39,15 +39,17 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false - name: Setup mdBook - uses: peaceiris/actions-mdbook@v2 + uses: peaceiris/actions-mdbook@ee69d230fe19748b7abf22df32acaa93833fad08 # v2 with: mdbook-version: "0.4.36" - name: Install protoc - uses: arduino/setup-protoc@v3 + uses: arduino/setup-protoc@c65c819552d16ad3c9b72d9dfd5ba5237b9c906b # v3 with: repo-token: ${{ secrets.GITHUB_TOKEN }} @@ -64,7 +66,7 @@ jobs: cp -r target/doc ./website/book/api - name: Deploy to gh-pages - uses: peaceiris/actions-gh-pages@v4.0.0 + uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0 if: github.event_name == 'push' && github.ref_name == 'main' with: github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/zizmor.yml b/.github/workflows/zizmor.yml new file mode 100644 index 0000000000..313835fcbe --- /dev/null +++ b/.github/workflows/zizmor.yml @@ -0,0 +1,44 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +name: GitHub Actions Security Analysis with zizmor 🌈 + +on: + push: + branches: ["main"] + pull_request: + branches: ["**"] + +permissions: {} + +jobs: + zizmor: + name: Run zizmor 🌈 + runs-on: ubuntu-latest + permissions: {} + steps: + - name: Checkout repository + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + + - name: Run zizmor 🌈 + uses: zizmorcore/zizmor-action@71321a20a9ded102f6e9ce5718a2fcec2c4f70d8 # v0.5.2 + with: + advanced-security: false From 508ad7c49c7c219e1caf670da4268551769de9e1 Mon Sep 17 00:00:00 2001 From: Kevin Liu Date: Tue, 31 Mar 2026 16:44:59 -0700 Subject: [PATCH 13/23] ci: ensure use bash shell for env (#2305) (cherry picked from commit dc3a2d573b666b5bea2b0f33fc2719e7bfe35dd8) --- .github/actions/setup-builder/action.yml | 2 +- .github/workflows/ci.yml | 1 + .github/workflows/publish.yml | 1 + .github/workflows/release_python.yml | 3 +++ 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/actions/setup-builder/action.yml b/.github/actions/setup-builder/action.yml index 532174590f..e961ed6335 100644 --- a/.github/actions/setup-builder/action.yml +++ b/.github/actions/setup-builder/action.yml @@ -26,8 +26,8 @@ runs: using: "composite" steps: - name: Setup specified Rust toolchain - shell: bash if: ${{ inputs.rust-version != '' }} + shell: bash env: RUST_VERSION: ${{ inputs.rust-version }} run: | diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 63ee893fa2..071d6dbcbf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -172,6 +172,7 @@ jobs: run: make docker-up - name: Run tests + shell: bash env: # Disable debug info to speed up compilation and reduce artifact size RUSTFLAGS: "-C debuginfo=0" diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index d6ba35d9f4..83e1031d17 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -65,6 +65,7 @@ jobs: # Only publish if it's a tag and the tag is not a pre-release if: ${{ startsWith(github.ref, 'refs/tags/') && !contains(github.ref, '-') }} run: cargo publish --all-features # zizmor: ignore[use-trusted-publishing] -- https://github.com/apache/iceberg-rust/issues/1539 + shell: bash env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} diff --git a/.github/workflows/release_python.yml b/.github/workflows/release_python.yml index d9fcdd406b..b19fa165dc 100644 --- a/.github/workflows/release_python.yml +++ b/.github/workflows/release_python.yml @@ -49,6 +49,7 @@ jobs: - name: Validate release tag format id: validate # Valid formats: v.. OR v..-rc. + shell: bash env: RELEASE_TAG: ${{ inputs.release_tag }} run: | @@ -119,6 +120,7 @@ jobs: # doing this explicitly to avoid issue in Windows where `mv` does not overwrite existing file rm Cargo.toml mv Cargo.toml.tmp Cargo.toml + shell: bash env: NEEDS_VALIDATE_RELEASE_TAG_OUTPUTS_CARGO_VERSION: ${{ needs.validate-release-tag.outputs.cargo-version }} @@ -161,6 +163,7 @@ jobs: - name: Set cargo version for RC if: ${{ needs.validate-release-tag.outputs.is-rc == 'true' }} working-directory: "bindings/python" + shell: bash env: CARGO_VERSION: ${{ needs.validate-release-tag.outputs.cargo-version }} run: | From e40a2a7894902536f063711c8261c0a2cba2e11f Mon Sep 17 00:00:00 2001 From: blackmwk Date: Mon, 13 Apr 2026 16:29:51 +0800 Subject: [PATCH 14/23] Fix zizmor workflow (#2324) ## Which issue does this PR close? - Closes #2323 . ## What changes are included in this PR? ## Are these changes tested? ci (cherry picked from commit 59c8f4b7a9a6e31dd5033b3c0a37e8d483f4809b) --- .github/workflows/bindings_python_ci.yml | 2 +- .github/workflows/release_python.yml | 8 ++++---- .github/workflows/release_python_nightly.yml | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/bindings_python_ci.yml b/.github/workflows/bindings_python_ci.yml index a7abfcbeed..a02ae9f0af 100644 --- a/.github/workflows/bindings_python_ci.yml +++ b/.github/workflows/bindings_python_ci.yml @@ -95,7 +95,7 @@ jobs: - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 with: python-version: 3.12 - - uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1 + - uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1.50.1 with: working-directory: "bindings/python" command: build diff --git a/.github/workflows/release_python.yml b/.github/workflows/release_python.yml index b19fa165dc..c9817e064c 100644 --- a/.github/workflows/release_python.yml +++ b/.github/workflows/release_python.yml @@ -124,13 +124,13 @@ jobs: env: NEEDS_VALIDATE_RELEASE_TAG_OUTPUTS_CARGO_VERSION: ${{ needs.validate-release-tag.outputs.cargo-version }} - - uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1 + - uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1.50.1 with: working-directory: "bindings/python" command: sdist args: -o dist - name: Upload sdist - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: wheels-sdist path: bindings/python/dist @@ -184,7 +184,7 @@ jobs: uses: ./.github/actions/setup-builder with: rust-version: ${{ steps.get-msrv.outputs.msrv }} - - uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1 + - uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1.50.1 with: target: ${{ matrix.target }} manylinux: ${{ matrix.manylinux || 'auto' }} @@ -192,7 +192,7 @@ jobs: command: build args: --release -o dist -i python3.12 # Explicitly set interpreter; manylinux containers have multiple Pythons and maturin may pick an older one - name: Upload wheels - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: wheels-${{ matrix.os }}-${{ matrix.target }} path: bindings/python/dist diff --git a/.github/workflows/release_python_nightly.yml b/.github/workflows/release_python_nightly.yml index 86e589acd6..e2925d60cd 100644 --- a/.github/workflows/release_python_nightly.yml +++ b/.github/workflows/release_python_nightly.yml @@ -48,14 +48,14 @@ jobs: with: timestamp: ${{ needs.set-version.outputs.TIMESTAMP }} - - uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1 + - uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1.50.1 with: working-directory: "bindings/python" command: sdist args: -o dist - name: Upload sdist - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: wheels-sdist path: bindings/python/dist @@ -99,7 +99,7 @@ jobs: with: rust-version: ${{ steps.get-msrv.outputs.msrv }} - - uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1 + - uses: PyO3/maturin-action@04ac600d27cdf7a9a280dadf7147097c42b757ad # v1.50.1 with: target: ${{ matrix.target }} manylinux: ${{ matrix.manylinux || 'auto' }} @@ -108,7 +108,7 @@ jobs: args: --release -o dist -i python3.12 # Explicitly set interpreter; manylinux containers have multiple Pythons and maturin may pick an older one - name: Upload wheels - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: wheels-${{ matrix.os }}-${{ matrix.target }} path: bindings/python/dist From 63977f2b1666c923527bc2fcd3103f39cf31c8f9 Mon Sep 17 00:00:00 2001 From: Shawn Chang Date: Wed, 15 Apr 2026 11:43:46 -0700 Subject: [PATCH 15/23] chore: update comment tag to match the exact version to fix zizmor (#2333) ## Which issue does this PR close? - Closes #. ## What changes are included in this PR? - update codeql version from 4.35.1 to 4.35.2 - update comment tag ## Are these changes tested? (cherry picked from commit 5334dcb5ba670377c974b49c87c8c273f4c7181d) --- .github/workflows/codeql.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 81bc6b16f8..7e9c8208c8 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -46,11 +46,11 @@ jobs: persist-credentials: false - name: Initialize CodeQL - uses: github/codeql-action/init@c10b8064de6f491fea524254123dbe5e09572f13 # v4 + uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2 with: languages: actions - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@c10b8064de6f491fea524254123dbe5e09572f13 # v4 + uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4.35.2 with: category: "/language:actions" From b0c1251853d763ef8a8c962f0623082e7f075405 Mon Sep 17 00:00:00 2001 From: Shawn Chang Date: Wed, 22 Apr 2026 15:51:06 -0700 Subject: [PATCH 16/23] Bump version to 0.9.1 and update dep list --- Cargo.lock | 30 +- Cargo.toml | 18 +- bindings/python/Cargo.lock | 291 +----------------- bindings/python/DEPENDENCIES.rust.tsv | 10 +- crates/catalog/glue/DEPENDENCIES.rust.tsv | 29 +- crates/catalog/hms/DEPENDENCIES.rust.tsv | 15 +- crates/catalog/loader/DEPENDENCIES.rust.tsv | 38 +-- crates/catalog/rest/DEPENDENCIES.rust.tsv | 25 +- crates/catalog/s3tables/DEPENDENCIES.rust.tsv | 29 +- crates/catalog/sql/DEPENDENCIES.rust.tsv | 17 +- crates/examples/DEPENDENCIES.rust.tsv | 27 +- crates/iceberg/DEPENDENCIES.rust.tsv | 23 +- .../integration_tests/DEPENDENCIES.rust.tsv | 18 +- .../cache-moka/DEPENDENCIES.rust.tsv | 25 +- .../datafusion/DEPENDENCIES.rust.tsv | 16 +- .../playground/DEPENDENCIES.rust.tsv | 21 +- crates/sqllogictest/DEPENDENCIES.rust.tsv | 15 +- crates/storage/opendal/DEPENDENCIES.rust.tsv | 14 +- crates/test_utils/DEPENDENCIES.rust.tsv | 23 +- 19 files changed, 215 insertions(+), 469 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c34068d13d..8cb84bb1f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3260,7 +3260,7 @@ dependencies = [ [[package]] name = "iceberg" -version = "0.9.0" +version = "0.9.1" dependencies = [ "anyhow", "apache-avro", @@ -3319,7 +3319,7 @@ dependencies = [ [[package]] name = "iceberg-cache-moka" -version = "0.9.0" +version = "0.9.1" dependencies = [ "iceberg", "moka", @@ -3327,7 +3327,7 @@ dependencies = [ [[package]] name = "iceberg-catalog-glue" -version = "0.9.0" +version = "0.9.1" dependencies = [ "anyhow", "async-trait", @@ -3343,7 +3343,7 @@ dependencies = [ [[package]] name = "iceberg-catalog-hms" -version = "0.9.0" +version = "0.9.1" dependencies = [ "anyhow", "async-trait", @@ -3366,7 +3366,7 @@ dependencies = [ [[package]] name = "iceberg-catalog-loader" -version = "0.9.0" +version = "0.9.1" dependencies = [ "async-trait", "iceberg", @@ -3382,7 +3382,7 @@ dependencies = [ [[package]] name = "iceberg-catalog-rest" -version = "0.9.0" +version = "0.9.1" dependencies = [ "async-trait", "chrono", @@ -3403,7 +3403,7 @@ dependencies = [ [[package]] name = "iceberg-catalog-s3tables" -version = "0.9.0" +version = "0.9.1" dependencies = [ "anyhow", "async-trait", @@ -3418,7 +3418,7 @@ dependencies = [ [[package]] name = "iceberg-catalog-sql" -version = "0.9.0" +version = "0.9.1" dependencies = [ "async-trait", "iceberg", @@ -3432,7 +3432,7 @@ dependencies = [ [[package]] name = "iceberg-datafusion" -version = "0.9.0" +version = "0.9.1" dependencies = [ "anyhow", "async-trait", @@ -3449,7 +3449,7 @@ dependencies = [ [[package]] name = "iceberg-examples" -version = "0.9.0" +version = "0.9.1" dependencies = [ "futures", "iceberg", @@ -3460,7 +3460,7 @@ dependencies = [ [[package]] name = "iceberg-integration-tests" -version = "0.9.0" +version = "0.9.1" dependencies = [ "arrow-array", "arrow-schema", @@ -3477,7 +3477,7 @@ dependencies = [ [[package]] name = "iceberg-playground" -version = "0.9.0" +version = "0.9.1" dependencies = [ "anyhow", "clap", @@ -3499,7 +3499,7 @@ dependencies = [ [[package]] name = "iceberg-sqllogictest" -version = "0.9.0" +version = "0.9.1" dependencies = [ "anyhow", "async-trait", @@ -3521,7 +3521,7 @@ dependencies = [ [[package]] name = "iceberg-storage-opendal" -version = "0.9.0" +version = "0.9.1" dependencies = [ "anyhow", "async-trait", @@ -3540,7 +3540,7 @@ dependencies = [ [[package]] name = "iceberg_test_utils" -version = "0.9.0" +version = "0.9.1" dependencies = [ "iceberg", "tracing-subscriber", diff --git a/Cargo.toml b/Cargo.toml index 62834f1e9b..9a1d5f4607 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,7 @@ resolver = "2" [workspace.package] edition = "2024" homepage = "https://rust.iceberg.apache.org/" -version = "0.9.0" +version = "0.9.1" license = "Apache-2.0" repository = "https://github.com/apache/iceberg-rust" @@ -80,14 +80,14 @@ futures = "0.3" hive_metastore = "0.2.0" home = "=0.5.11" http = "1.2" -iceberg = { version = "0.9.0", path = "./crates/iceberg" } -iceberg-catalog-glue = { version = "0.9.0", path = "./crates/catalog/glue" } -iceberg-catalog-hms = { version = "0.9.0", path = "./crates/catalog/hms" } -iceberg-catalog-rest = { version = "0.9.0", path = "./crates/catalog/rest" } -iceberg-catalog-s3tables = { version = "0.9.0", path = "./crates/catalog/s3tables" } -iceberg-catalog-sql = { version = "0.9.0", path = "./crates/catalog/sql" } -iceberg-datafusion = { version = "0.9.0", path = "./crates/integrations/datafusion" } -iceberg-storage-opendal = { version = "0.9.0", path = "./crates/storage/opendal" } +iceberg = { version = "0.9.1", path = "./crates/iceberg" } +iceberg-catalog-glue = { version = "0.9.1", path = "./crates/catalog/glue" } +iceberg-catalog-hms = { version = "0.9.1", path = "./crates/catalog/hms" } +iceberg-catalog-rest = { version = "0.9.1", path = "./crates/catalog/rest" } +iceberg-catalog-s3tables = { version = "0.9.1", path = "./crates/catalog/s3tables" } +iceberg-catalog-sql = { version = "0.9.1", path = "./crates/catalog/sql" } +iceberg-datafusion = { version = "0.9.1", path = "./crates/integrations/datafusion" } +iceberg-storage-opendal = { version = "0.9.1", path = "./crates/storage/opendal" } indicatif = "0.18" itertools = "0.13" libtest-mimic = "0.8.1" diff --git a/bindings/python/Cargo.lock b/bindings/python/Cargo.lock index b93715c895..ba75367ca9 100644 --- a/bindings/python/Cargo.lock +++ b/bindings/python/Cargo.lock @@ -56,17 +56,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - [[package]] name = "ahash" version = "0.8.12" @@ -139,7 +128,7 @@ dependencies = [ "miniz_oxide", "num-bigint", "quad-rand", - "rand 0.9.2", + "rand 0.9.4", "regex-lite", "serde", "serde_bytes", @@ -515,12 +504,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "base64ct" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" - [[package]] name = "bigdecimal" version = "0.4.9" @@ -578,15 +561,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block-padding" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" -dependencies = [ - "generic-array", -] - [[package]] name = "bnum" version = "0.12.1" @@ -676,15 +650,6 @@ dependencies = [ "libbz2-rs-sys", ] -[[package]] -name = "cbc" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" -dependencies = [ - "cipher", -] - [[package]] name = "cc" version = "1.2.43" @@ -733,16 +698,6 @@ dependencies = [ "phf", ] -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - [[package]] name = "comfy-table" version = "7.1.2" @@ -1063,7 +1018,7 @@ dependencies = [ "object_store", "parking_lot", "parquet", - "rand 0.9.2", + "rand 0.9.4", "regex", "sqlparser", "tempfile", @@ -1184,7 +1139,7 @@ dependencies = [ "liblzma", "log", "object_store", - "rand 0.9.2", + "rand 0.9.4", "tokio", "tokio-util", "url", @@ -1312,7 +1267,7 @@ dependencies = [ "log", "object_store", "parking_lot", - "rand 0.9.2", + "rand 0.9.4", "tempfile", "url", ] @@ -1407,7 +1362,7 @@ dependencies = [ "log", "md-5", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "regex", "sha2", "unicode-segmentation", @@ -1739,17 +1694,6 @@ dependencies = [ "sqlparser", ] -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - [[package]] name = "deranged" version = "0.5.5" @@ -2338,7 +2282,7 @@ dependencies = [ [[package]] name = "iceberg" -version = "0.9.0" +version = "0.9.1" dependencies = [ "anyhow", "apache-avro", @@ -2370,7 +2314,7 @@ dependencies = [ "once_cell", "ordered-float 4.6.0", "parquet", - "rand 0.8.5", + "rand 0.9.4", "reqwest", "roaring", "serde", @@ -2390,7 +2334,7 @@ dependencies = [ [[package]] name = "iceberg-datafusion" -version = "0.9.0" +version = "0.9.1" dependencies = [ "anyhow", "async-trait", @@ -2405,13 +2349,12 @@ dependencies = [ [[package]] name = "iceberg-storage-opendal" -version = "0.9.0" +version = "0.9.1" dependencies = [ "anyhow", "async-trait", "bytes", "cfg-if", - "futures", "iceberg", "opendal", "reqsign", @@ -2561,16 +2504,6 @@ dependencies = [ "rustversion", ] -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "block-padding", - "generic-array", -] - [[package]] name = "integer-encoding" version = "3.0.4" @@ -2687,30 +2620,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "jsonwebtoken" -version = "9.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" -dependencies = [ - "base64", - "js-sys", - "pem", - "ring", - "serde", - "serde_json", - "simple_asn1", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - [[package]] name = "lexical-core" version = "1.0.6" @@ -2951,22 +2860,6 @@ dependencies = [ "serde", ] -[[package]] -name = "num-bigint-dig" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" -dependencies = [ - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand 0.8.5", - "smallvec", - "zeroize", -] - [[package]] name = "num-complex" version = "0.4.6" @@ -2991,17 +2884,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -3180,35 +3062,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest", - "hmac", -] - -[[package]] -name = "pem" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" -dependencies = [ - "base64", - "serde_core", -] - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - [[package]] name = "percent-encoding" version = "2.3.2" @@ -3257,44 +3110,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs5" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e847e2c91a18bfa887dd028ec33f2fe6f25db77db3619024764914affe8b69a6" -dependencies = [ - "aes", - "cbc", - "der", - "pbkdf2", - "scrypt", - "sha2", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "pkcs5", - "rand_core 0.6.4", - "spki", -] - [[package]] name = "pkg-config" version = "0.3.32" @@ -3521,7 +3336,7 @@ dependencies = [ "bytes", "getrandom 0.3.4", "lru-slab", - "rand 0.9.2", + "rand 0.9.4", "ring", "rustc-hash", "rustls", @@ -3575,9 +3390,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -3730,14 +3545,11 @@ dependencies = [ "hmac", "home", "http", - "jsonwebtoken", "log", - "once_cell", "percent-encoding", "quick-xml 0.37.5", "rand 0.8.5", "reqwest", - "rsa", "rust-ini", "serde", "serde_json", @@ -3811,27 +3623,6 @@ dependencies = [ "byteorder", ] -[[package]] -name = "rsa" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" -dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core 0.6.4", - "sha2", - "signature", - "spki", - "subtle", - "zeroize", -] - [[package]] name = "rust-ini" version = "0.21.3" @@ -3917,15 +3708,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" -[[package]] -name = "salsa20" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" -dependencies = [ - "cipher", -] - [[package]] name = "same-file" version = "1.0.6" @@ -3965,17 +3747,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "scrypt" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0516a385866c09368f0b5bcd1caff3366aace790fcd46e2bb032697bb172fd1f" -dependencies = [ - "pbkdf2", - "salsa20", - "sha2", -] - [[package]] name = "semver" version = "1.0.27" @@ -4132,16 +3903,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest", - "rand_core 0.6.4", -] - [[package]] name = "simd-adler32" version = "0.3.7" @@ -4154,18 +3915,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" -[[package]] -name = "simple_asn1" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" -dependencies = [ - "num-bigint", - "num-traits", - "thiserror", - "time", -] - [[package]] name = "siphasher" version = "1.0.1" @@ -4200,22 +3949,6 @@ dependencies = [ "windows-sys 0.60.2", ] -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - [[package]] name = "sqlparser" version = "0.59.0" diff --git a/bindings/python/DEPENDENCIES.rust.tsv b/bindings/python/DEPENDENCIES.rust.tsv index 0369095eaa..2893978e75 100644 --- a/bindings/python/DEPENDENCIES.rust.tsv +++ b/bindings/python/DEPENDENCIES.rust.tsv @@ -180,9 +180,9 @@ hyper-rustls@0.27.7 X X X hyper-util@0.1.17 X iana-time-zone@0.1.64 X X iana-time-zone-haiku@0.1.2 X X -iceberg@0.9.0 X -iceberg-datafusion@0.9.0 X -iceberg-storage-opendal@0.9.0 X +iceberg@0.9.1 X +iceberg-datafusion@0.9.1 X +iceberg-storage-opendal@0.9.1 X icu_collections@2.1.0 X icu_locale_core@2.1.0 X icu_normalizer@2.1.0 X @@ -274,7 +274,7 @@ quick-xml@0.38.3 X quote@1.0.41 X X r-efi@5.3.0 X X X rand@0.8.5 X X -rand@0.9.2 X X +rand@0.9.4 X X rand_chacha@0.3.1 X X rand_chacha@0.9.0 X X rand_core@0.6.4 X X @@ -295,7 +295,7 @@ rustc_version@0.4.1 X X rustix@1.1.2 X X X rustls@0.23.34 X X X rustls-pki-types@1.13.0 X X -rustls-webpki@0.103.7 X +rustls-webpki@0.103.10 X rustversion@1.0.22 X X ryu@1.0.20 X X same-file@1.0.6 X X diff --git a/crates/catalog/glue/DEPENDENCIES.rust.tsv b/crates/catalog/glue/DEPENDENCIES.rust.tsv index 21a6a469a9..530e7f27cb 100644 --- a/crates/catalog/glue/DEPENDENCIES.rust.tsv +++ b/crates/catalog/glue/DEPENDENCIES.rust.tsv @@ -57,6 +57,7 @@ brotli@8.0.2 X X brotli-decompressor@5.0.0 X X bumpalo@3.20.2 X X bytemuck@1.25.0 X X X +bytemuck_derive@1.10.2 X X X byteorder@1.5.0 X X bytes@1.11.1 X bytes-utils@0.1.4 X X @@ -67,7 +68,6 @@ concurrent-queue@2.5.0 X X const-oid@0.9.6 X X const-random@0.1.18 X X const-random-macro@0.1.16 X X -core-foundation@0.10.1 X X core-foundation-sys@0.8.7 X X cpufeatures@0.2.17 X X crc32c@0.6.8 X X @@ -121,7 +121,6 @@ getrandom@0.2.17 X X getrandom@0.3.4 X X getrandom@0.4.1 X X gloo-timers@0.3.0 X X -h2@0.3.27 X h2@0.4.13 X half@2.7.1 X X hashbrown@0.16.1 X X @@ -135,18 +134,15 @@ http-body@0.4.6 X http-body@1.0.1 X http-body-util@0.1.3 X httparse@1.10.1 X X -httpdate@1.0.3 X X -hyper@0.14.32 X hyper@1.8.1 X -hyper-rustls@0.24.2 X X X hyper-rustls@0.27.7 X X X hyper-util@0.1.20 X iana-time-zone@0.1.65 X X iana-time-zone-haiku@0.1.2 X X -iceberg@0.9.0 X -iceberg-catalog-glue@0.9.0 X -iceberg-storage-opendal@0.9.0 X -iceberg_test_utils@0.9.0 X +iceberg@0.9.1 X +iceberg-catalog-glue@0.9.1 X +iceberg-storage-opendal@0.9.1 X +iceberg_test_utils@0.9.1 X icu_collections@2.1.1 X icu_locale_core@2.1.1 X icu_normalizer@2.1.1 X @@ -181,7 +177,7 @@ libm@0.2.16 X litemap@0.8.1 X lock_api@0.4.14 X X log@0.4.29 X X -lz4_flex@0.12.0 X +lz4_flex@0.12.1 X md-5@0.10.6 X X memchr@2.8.0 X X miniz_oxide@0.8.9 X X X @@ -196,7 +192,6 @@ num-integer@0.1.46 X X num-traits@0.2.19 X X once_cell@1.21.3 X X opendal@0.55.0 X -openssl-probe@0.2.1 X X ordered-float@2.10.1 X ordered-float@4.6.0 X outref@0.5.2 X @@ -221,7 +216,7 @@ quick-xml@0.38.4 X quote@1.0.44 X X r-efi@5.3.0 X X X rand@0.8.5 X X -rand@0.9.2 X X +rand@0.9.4 X X rand_chacha@0.3.1 X X rand_chacha@0.9.0 X X rand_core@0.6.4 X X @@ -236,19 +231,12 @@ reqwest@0.12.28 X X ring@0.17.14 X X roaring@0.11.3 X X rustc_version@0.4.1 X X -rustls@0.21.12 X X X rustls@0.23.37 X X X -rustls-native-certs@0.8.3 X X X rustls-pki-types@1.14.0 X X -rustls-webpki@0.101.7 X -rustls-webpki@0.103.9 X +rustls-webpki@0.103.12 X rustversion@1.0.22 X X ryu@1.0.23 X X -schannel@0.1.28 X scopeguard@1.2.0 X X -sct@0.7.1 X X X -security-framework@3.7.0 X X -security-framework-sys@2.17.0 X X semver@1.0.27 X X seq-macro@0.3.6 X X serde@1.0.228 X X @@ -292,7 +280,6 @@ tiny-keccak@2.0.2 X tinystr@0.8.2 X tokio@1.50.0 X tokio-macros@2.6.1 X -tokio-rustls@0.24.1 X X tokio-rustls@0.26.4 X X tokio-util@0.7.18 X tower@0.5.3 X diff --git a/crates/catalog/hms/DEPENDENCIES.rust.tsv b/crates/catalog/hms/DEPENDENCIES.rust.tsv index de1c2f368a..cceb335d86 100644 --- a/crates/catalog/hms/DEPENDENCIES.rust.tsv +++ b/crates/catalog/hms/DEPENDENCIES.rust.tsv @@ -39,6 +39,7 @@ brotli@8.0.2 X X brotli-decompressor@5.0.0 X X bumpalo@3.20.2 X X bytemuck@1.25.0 X X X +bytemuck_derive@1.10.2 X X X byteorder@1.5.0 X X bytes@1.11.1 X cc@1.2.56 X X @@ -120,10 +121,10 @@ hyper-rustls@0.27.7 X X X hyper-util@0.1.20 X iana-time-zone@0.1.65 X X iana-time-zone-haiku@0.1.2 X X -iceberg@0.9.0 X -iceberg-catalog-hms@0.9.0 X -iceberg-storage-opendal@0.9.0 X -iceberg_test_utils@0.9.0 X +iceberg@0.9.1 X +iceberg-catalog-hms@0.9.1 X +iceberg-storage-opendal@0.9.1 X +iceberg_test_utils@0.9.1 X icu_collections@2.1.1 X icu_locale_core@2.1.1 X icu_normalizer@2.1.1 X @@ -161,7 +162,7 @@ linkedbytes@0.1.16 X X litemap@0.8.1 X lock_api@0.4.14 X X log@0.4.29 X X -lz4_flex@0.12.0 X +lz4_flex@0.12.1 X md-5@0.10.6 X X memchr@2.8.0 X X memoffset@0.9.1 X @@ -209,7 +210,7 @@ quick-xml@0.38.4 X quote@1.0.44 X X r-efi@5.3.0 X X X rand@0.8.5 X X -rand@0.9.2 X X +rand@0.9.4 X X rand_chacha@0.3.1 X X rand_chacha@0.9.0 X X rand_core@0.6.4 X X @@ -229,7 +230,7 @@ rustc-hash@2.1.1 X X rustc_version@0.4.1 X X rustls@0.23.37 X X X rustls-pki-types@1.14.0 X X -rustls-webpki@0.103.9 X +rustls-webpki@0.103.12 X rustversion@1.0.22 X X ryu@1.0.23 X X scopeguard@1.2.0 X X diff --git a/crates/catalog/loader/DEPENDENCIES.rust.tsv b/crates/catalog/loader/DEPENDENCIES.rust.tsv index dae8032841..4b620d08a0 100644 --- a/crates/catalog/loader/DEPENDENCIES.rust.tsv +++ b/crates/catalog/loader/DEPENDENCIES.rust.tsv @@ -61,6 +61,7 @@ brotli@8.0.2 X X brotli-decompressor@5.0.0 X X bumpalo@3.20.2 X X bytemuck@1.25.0 X X X +bytemuck_derive@1.10.2 X X X byteorder@1.5.0 X X bytes@1.11.1 X bytes-utils@0.1.4 X X @@ -72,7 +73,6 @@ concurrent-queue@2.5.0 X X const-oid@0.9.6 X X const-random@0.1.18 X X const-random-macro@0.1.16 X X -core-foundation@0.10.1 X X core-foundation-sys@0.8.7 X X cpufeatures@0.2.17 X X crc@3.4.0 X X @@ -134,7 +134,6 @@ getrandom@0.2.17 X X getrandom@0.3.4 X X getrandom@0.4.1 X X gloo-timers@0.3.0 X X -h2@0.3.27 X h2@0.4.13 X half@2.7.1 X X hashbrown@0.14.5 X X @@ -153,22 +152,20 @@ http-body@1.0.1 X http-body-util@0.1.3 X httparse@1.10.1 X X httpdate@1.0.3 X X -hyper@0.14.32 X hyper@1.8.1 X -hyper-rustls@0.24.2 X X X hyper-rustls@0.27.7 X X X hyper-util@0.1.20 X iana-time-zone@0.1.65 X X iana-time-zone-haiku@0.1.2 X X -iceberg@0.9.0 X -iceberg-catalog-glue@0.9.0 X -iceberg-catalog-hms@0.9.0 X -iceberg-catalog-loader@0.9.0 X -iceberg-catalog-rest@0.9.0 X -iceberg-catalog-s3tables@0.9.0 X -iceberg-catalog-sql@0.9.0 X -iceberg-storage-opendal@0.9.0 X -iceberg_test_utils@0.9.0 X +iceberg@0.9.1 X +iceberg-catalog-glue@0.9.1 X +iceberg-catalog-hms@0.9.1 X +iceberg-catalog-loader@0.9.1 X +iceberg-catalog-rest@0.9.1 X +iceberg-catalog-s3tables@0.9.1 X +iceberg-catalog-sql@0.9.1 X +iceberg-storage-opendal@0.9.1 X +iceberg_test_utils@0.9.1 X icu_collections@2.1.1 X icu_locale_core@2.1.1 X icu_normalizer@2.1.1 X @@ -207,7 +204,7 @@ linkedbytes@0.1.16 X X litemap@0.8.1 X lock_api@0.4.14 X X log@0.4.29 X X -lz4_flex@0.12.0 X +lz4_flex@0.12.1 X md-5@0.10.6 X X memchr@2.8.0 X X memoffset@0.9.1 X @@ -230,7 +227,6 @@ num_enum@0.7.5 X X X num_enum_derive@0.7.5 X X X once_cell@1.21.3 X X opendal@0.55.0 X -openssl-probe@0.2.1 X X ordered-float@2.10.1 X ordered-float@4.6.0 X outref@0.5.2 X @@ -259,7 +255,7 @@ quick-xml@0.38.4 X quote@1.0.44 X X r-efi@5.3.0 X X X rand@0.8.5 X X -rand@0.9.2 X X +rand@0.9.4 X X rand_chacha@0.3.1 X X rand_chacha@0.9.0 X X rand_core@0.6.4 X X @@ -277,19 +273,12 @@ ring@0.17.14 X X roaring@0.11.3 X X rustc-hash@2.1.1 X X rustc_version@0.4.1 X X -rustls@0.21.12 X X X rustls@0.23.37 X X X -rustls-native-certs@0.8.3 X X X rustls-pki-types@1.14.0 X X -rustls-webpki@0.101.7 X -rustls-webpki@0.103.9 X +rustls-webpki@0.103.12 X rustversion@1.0.22 X X ryu@1.0.23 X X -schannel@0.1.28 X scopeguard@1.2.0 X X -sct@0.7.1 X X X -security-framework@3.7.0 X X -security-framework-sys@2.17.0 X X semver@1.0.27 X X seq-macro@0.3.6 X X serde@1.0.228 X X @@ -342,7 +331,6 @@ tiny-keccak@2.0.2 X tinystr@0.8.2 X tokio@1.50.0 X tokio-macros@2.6.1 X -tokio-rustls@0.24.1 X X tokio-rustls@0.26.4 X X tokio-stream@0.1.18 X tokio-util@0.7.18 X diff --git a/crates/catalog/rest/DEPENDENCIES.rust.tsv b/crates/catalog/rest/DEPENDENCIES.rust.tsv index 77bcb45f44..036a63f8f3 100644 --- a/crates/catalog/rest/DEPENDENCIES.rust.tsv +++ b/crates/catalog/rest/DEPENDENCIES.rust.tsv @@ -37,6 +37,7 @@ brotli@8.0.2 X X brotli-decompressor@5.0.0 X X bumpalo@3.20.2 X X bytemuck@1.25.0 X X X +bytemuck_derive@1.10.2 X X X byteorder@1.5.0 X X bytes@1.11.1 X cc@1.2.56 X X @@ -107,9 +108,9 @@ hyper@1.8.1 X hyper-util@0.1.20 X iana-time-zone@0.1.65 X X iana-time-zone-haiku@0.1.2 X X -iceberg@0.9.0 X -iceberg-catalog-rest@0.9.0 X -iceberg_test_utils@0.9.0 X +iceberg@0.9.1 X +iceberg-catalog-rest@0.9.1 X +iceberg_test_utils@0.9.1 X icu_collections@2.1.1 X icu_locale_core@2.1.1 X icu_normalizer@2.1.1 X @@ -141,7 +142,7 @@ libm@0.2.16 X litemap@0.8.1 X lock_api@0.4.14 X X log@0.4.29 X X -lz4_flex@0.12.0 X +lz4_flex@0.12.1 X memchr@2.8.0 X X miniz_oxide@0.8.9 X X X mio@1.1.1 X @@ -172,11 +173,8 @@ proc-macro2@1.0.106 X X quad-rand@0.2.3 X quote@1.0.44 X X r-efi@5.3.0 X X X -rand@0.8.5 X X -rand@0.9.2 X X -rand_chacha@0.3.1 X X +rand@0.9.4 X X rand_chacha@0.9.0 X X -rand_core@0.6.4 X X rand_core@0.9.5 X X redox_syscall@0.5.18 X regex@1.12.3 X X @@ -208,6 +206,7 @@ simdutf8@0.1.5 X X slab@0.4.12 X smallvec@1.15.1 X X snap@1.1.1 X +socket2@0.5.10 X X socket2@0.6.2 X X stable_deref_trait@1.2.1 X X strsim@0.11.1 X @@ -264,16 +263,26 @@ windows-interface@0.59.3 X X windows-link@0.2.1 X X windows-result@0.4.1 X X windows-strings@0.5.1 X X +windows-sys@0.52.0 X X windows-sys@0.60.2 X X windows-sys@0.61.2 X X +windows-targets@0.52.6 X X windows-targets@0.53.5 X X +windows_aarch64_gnullvm@0.52.6 X X windows_aarch64_gnullvm@0.53.1 X X +windows_aarch64_msvc@0.52.6 X X windows_aarch64_msvc@0.53.1 X X +windows_i686_gnu@0.52.6 X X windows_i686_gnu@0.53.1 X X +windows_i686_gnullvm@0.52.6 X X windows_i686_gnullvm@0.53.1 X X +windows_i686_msvc@0.52.6 X X windows_i686_msvc@0.53.1 X X +windows_x86_64_gnu@0.52.6 X X windows_x86_64_gnu@0.53.1 X X +windows_x86_64_gnullvm@0.52.6 X X windows_x86_64_gnullvm@0.53.1 X X +windows_x86_64_msvc@0.52.6 X X windows_x86_64_msvc@0.53.1 X X wit-bindgen@0.51.0 X X X writeable@0.6.2 X diff --git a/crates/catalog/s3tables/DEPENDENCIES.rust.tsv b/crates/catalog/s3tables/DEPENDENCIES.rust.tsv index 384e588589..ae37609611 100644 --- a/crates/catalog/s3tables/DEPENDENCIES.rust.tsv +++ b/crates/catalog/s3tables/DEPENDENCIES.rust.tsv @@ -57,6 +57,7 @@ brotli@8.0.2 X X brotli-decompressor@5.0.0 X X bumpalo@3.20.2 X X bytemuck@1.25.0 X X X +bytemuck_derive@1.10.2 X X X byteorder@1.5.0 X X bytes@1.11.1 X bytes-utils@0.1.4 X X @@ -67,7 +68,6 @@ concurrent-queue@2.5.0 X X const-oid@0.9.6 X X const-random@0.1.18 X X const-random-macro@0.1.16 X X -core-foundation@0.10.1 X X core-foundation-sys@0.8.7 X X cpufeatures@0.2.17 X X crc32c@0.6.8 X X @@ -121,7 +121,6 @@ getrandom@0.2.17 X X getrandom@0.3.4 X X getrandom@0.4.1 X X gloo-timers@0.3.0 X X -h2@0.3.27 X h2@0.4.13 X half@2.7.1 X X hashbrown@0.16.1 X X @@ -135,18 +134,15 @@ http-body@0.4.6 X http-body@1.0.1 X http-body-util@0.1.3 X httparse@1.10.1 X X -httpdate@1.0.3 X X -hyper@0.14.32 X hyper@1.8.1 X -hyper-rustls@0.24.2 X X X hyper-rustls@0.27.7 X X X hyper-util@0.1.20 X iana-time-zone@0.1.65 X X iana-time-zone-haiku@0.1.2 X X -iceberg@0.9.0 X -iceberg-catalog-s3tables@0.9.0 X -iceberg-storage-opendal@0.9.0 X -iceberg_test_utils@0.9.0 X +iceberg@0.9.1 X +iceberg-catalog-s3tables@0.9.1 X +iceberg-storage-opendal@0.9.1 X +iceberg_test_utils@0.9.1 X icu_collections@2.1.1 X icu_locale_core@2.1.1 X icu_normalizer@2.1.1 X @@ -181,7 +177,7 @@ libm@0.2.16 X litemap@0.8.1 X lock_api@0.4.14 X X log@0.4.29 X X -lz4_flex@0.12.0 X +lz4_flex@0.12.1 X md-5@0.10.6 X X memchr@2.8.0 X X miniz_oxide@0.8.9 X X X @@ -196,7 +192,6 @@ num-integer@0.1.46 X X num-traits@0.2.19 X X once_cell@1.21.3 X X opendal@0.55.0 X -openssl-probe@0.2.1 X X ordered-float@2.10.1 X ordered-float@4.6.0 X outref@0.5.2 X @@ -221,7 +216,7 @@ quick-xml@0.38.4 X quote@1.0.44 X X r-efi@5.3.0 X X X rand@0.8.5 X X -rand@0.9.2 X X +rand@0.9.4 X X rand_chacha@0.3.1 X X rand_chacha@0.9.0 X X rand_core@0.6.4 X X @@ -236,19 +231,12 @@ reqwest@0.12.28 X X ring@0.17.14 X X roaring@0.11.3 X X rustc_version@0.4.1 X X -rustls@0.21.12 X X X rustls@0.23.37 X X X -rustls-native-certs@0.8.3 X X X rustls-pki-types@1.14.0 X X -rustls-webpki@0.101.7 X -rustls-webpki@0.103.9 X +rustls-webpki@0.103.12 X rustversion@1.0.22 X X ryu@1.0.23 X X -schannel@0.1.28 X scopeguard@1.2.0 X X -sct@0.7.1 X X X -security-framework@3.7.0 X X -security-framework-sys@2.17.0 X X semver@1.0.27 X X seq-macro@0.3.6 X X serde@1.0.228 X X @@ -292,7 +280,6 @@ tiny-keccak@2.0.2 X tinystr@0.8.2 X tokio@1.50.0 X tokio-macros@2.6.1 X -tokio-rustls@0.24.1 X X tokio-rustls@0.26.4 X X tokio-util@0.7.18 X tower@0.5.3 X diff --git a/crates/catalog/sql/DEPENDENCIES.rust.tsv b/crates/catalog/sql/DEPENDENCIES.rust.tsv index 144c559329..37ff2c0b91 100644 --- a/crates/catalog/sql/DEPENDENCIES.rust.tsv +++ b/crates/catalog/sql/DEPENDENCIES.rust.tsv @@ -38,6 +38,7 @@ brotli@8.0.2 X X brotli-decompressor@5.0.0 X X bumpalo@3.20.2 X X bytemuck@1.25.0 X X X +bytemuck_derive@1.10.2 X X X byteorder@1.5.0 X X bytes@1.11.1 X cc@1.2.56 X X @@ -115,9 +116,9 @@ hyper@1.8.1 X hyper-util@0.1.20 X iana-time-zone@0.1.65 X X iana-time-zone-haiku@0.1.2 X X -iceberg@0.9.0 X -iceberg-catalog-sql@0.9.0 X -iceberg_test_utils@0.9.0 X +iceberg@0.9.1 X +iceberg-catalog-sql@0.9.1 X +iceberg_test_utils@0.9.1 X icu_collections@2.1.1 X icu_locale_core@2.1.1 X icu_normalizer@2.1.1 X @@ -150,7 +151,7 @@ libsqlite3-sys@0.30.1 X litemap@0.8.1 X lock_api@0.4.14 X X log@0.4.29 X X -lz4_flex@0.12.0 X +lz4_flex@0.12.1 X memchr@2.8.0 X X miniz_oxide@0.8.9 X X X mio@1.1.1 X @@ -181,11 +182,8 @@ proc-macro2@1.0.106 X X quad-rand@0.2.3 X quote@1.0.44 X X r-efi@5.3.0 X X X -rand@0.8.5 X X -rand@0.9.2 X X -rand_chacha@0.3.1 X X +rand@0.9.4 X X rand_chacha@0.9.0 X X -rand_core@0.6.4 X X rand_core@0.9.5 X X redox_syscall@0.5.18 X regex@1.12.3 X X @@ -198,7 +196,7 @@ roaring@0.11.3 X X rustc_version@0.4.1 X X rustls@0.23.37 X X X rustls-pki-types@1.14.0 X X -rustls-webpki@0.103.9 X +rustls-webpki@0.103.12 X rustversion@1.0.22 X X ryu@1.0.23 X X scopeguard@1.2.0 X X @@ -222,6 +220,7 @@ simdutf8@0.1.5 X X slab@0.4.12 X smallvec@1.15.1 X X snap@1.1.1 X +socket2@0.5.10 X X socket2@0.6.2 X X spin@0.9.8 X sqlx@0.8.6 X X diff --git a/crates/examples/DEPENDENCIES.rust.tsv b/crates/examples/DEPENDENCIES.rust.tsv index 92525ab584..01e1c2656f 100644 --- a/crates/examples/DEPENDENCIES.rust.tsv +++ b/crates/examples/DEPENDENCIES.rust.tsv @@ -37,6 +37,7 @@ brotli@8.0.2 X X brotli-decompressor@5.0.0 X X bumpalo@3.20.2 X X bytemuck@1.25.0 X X X +bytemuck_derive@1.10.2 X X X byteorder@1.5.0 X X bytes@1.11.1 X cc@1.2.56 X X @@ -108,10 +109,10 @@ hyper@1.8.1 X hyper-util@0.1.20 X iana-time-zone@0.1.65 X X iana-time-zone-haiku@0.1.2 X X -iceberg@0.9.0 X -iceberg-catalog-rest@0.9.0 X -iceberg-examples@0.9.0 X -iceberg_test_utils@0.9.0 X +iceberg@0.9.1 X +iceberg-catalog-rest@0.9.1 X +iceberg-examples@0.9.1 X +iceberg_test_utils@0.9.1 X icu_collections@2.1.1 X icu_locale_core@2.1.1 X icu_normalizer@2.1.1 X @@ -143,7 +144,7 @@ libm@0.2.16 X litemap@0.8.1 X lock_api@0.4.14 X X log@0.4.29 X X -lz4_flex@0.12.0 X +lz4_flex@0.12.1 X memchr@2.8.0 X X miniz_oxide@0.8.9 X X X mio@1.1.1 X @@ -174,11 +175,8 @@ proc-macro2@1.0.106 X X quad-rand@0.2.3 X quote@1.0.44 X X r-efi@5.3.0 X X X -rand@0.8.5 X X -rand@0.9.2 X X -rand_chacha@0.3.1 X X +rand@0.9.4 X X rand_chacha@0.9.0 X X -rand_core@0.6.4 X X rand_core@0.9.5 X X redox_syscall@0.5.18 X regex@1.12.3 X X @@ -211,6 +209,7 @@ simdutf8@0.1.5 X X slab@0.4.12 X smallvec@1.15.1 X X snap@1.1.1 X +socket2@0.5.10 X X socket2@0.6.2 X X stable_deref_trait@1.2.1 X X strsim@0.11.1 X @@ -267,16 +266,26 @@ windows-interface@0.59.3 X X windows-link@0.2.1 X X windows-result@0.4.1 X X windows-strings@0.5.1 X X +windows-sys@0.52.0 X X windows-sys@0.60.2 X X windows-sys@0.61.2 X X +windows-targets@0.52.6 X X windows-targets@0.53.5 X X +windows_aarch64_gnullvm@0.52.6 X X windows_aarch64_gnullvm@0.53.1 X X +windows_aarch64_msvc@0.52.6 X X windows_aarch64_msvc@0.53.1 X X +windows_i686_gnu@0.52.6 X X windows_i686_gnu@0.53.1 X X +windows_i686_gnullvm@0.52.6 X X windows_i686_gnullvm@0.53.1 X X +windows_i686_msvc@0.52.6 X X windows_i686_msvc@0.53.1 X X +windows_x86_64_gnu@0.52.6 X X windows_x86_64_gnu@0.53.1 X X +windows_x86_64_gnullvm@0.52.6 X X windows_x86_64_gnullvm@0.53.1 X X +windows_x86_64_msvc@0.52.6 X X windows_x86_64_msvc@0.53.1 X X wit-bindgen@0.51.0 X X X writeable@0.6.2 X diff --git a/crates/iceberg/DEPENDENCIES.rust.tsv b/crates/iceberg/DEPENDENCIES.rust.tsv index 850a490d60..9eac41d515 100644 --- a/crates/iceberg/DEPENDENCIES.rust.tsv +++ b/crates/iceberg/DEPENDENCIES.rust.tsv @@ -37,6 +37,7 @@ brotli@8.0.2 X X brotli-decompressor@5.0.0 X X bumpalo@3.20.2 X X bytemuck@1.25.0 X X X +bytemuck_derive@1.10.2 X X X byteorder@1.5.0 X X bytes@1.11.1 X cc@1.2.56 X X @@ -105,8 +106,8 @@ hyper@1.8.1 X hyper-util@0.1.20 X iana-time-zone@0.1.65 X X iana-time-zone-haiku@0.1.2 X X -iceberg@0.9.0 X -iceberg_test_utils@0.9.0 X +iceberg@0.9.1 X +iceberg_test_utils@0.9.1 X icu_collections@2.1.1 X icu_locale_core@2.1.1 X icu_normalizer@2.1.1 X @@ -137,7 +138,7 @@ libm@0.2.16 X litemap@0.8.1 X lock_api@0.4.14 X X log@0.4.29 X X -lz4_flex@0.12.0 X +lz4_flex@0.12.1 X memchr@2.8.0 X X miniz_oxide@0.8.9 X X X mio@1.1.1 X @@ -168,11 +169,8 @@ proc-macro2@1.0.106 X X quad-rand@0.2.3 X quote@1.0.44 X X r-efi@5.3.0 X X X -rand@0.8.5 X X -rand@0.9.2 X X -rand_chacha@0.3.1 X X +rand@0.9.4 X X rand_chacha@0.9.0 X X -rand_core@0.6.4 X X rand_core@0.9.5 X X redox_syscall@0.5.18 X regex@1.12.3 X X @@ -204,6 +202,7 @@ simdutf8@0.1.5 X X slab@0.4.12 X smallvec@1.15.1 X X snap@1.1.1 X +socket2@0.5.10 X X socket2@0.6.2 X X stable_deref_trait@1.2.1 X X strsim@0.11.1 X @@ -258,16 +257,26 @@ windows-interface@0.59.3 X X windows-link@0.2.1 X X windows-result@0.4.1 X X windows-strings@0.5.1 X X +windows-sys@0.52.0 X X windows-sys@0.60.2 X X windows-sys@0.61.2 X X +windows-targets@0.52.6 X X windows-targets@0.53.5 X X +windows_aarch64_gnullvm@0.52.6 X X windows_aarch64_gnullvm@0.53.1 X X +windows_aarch64_msvc@0.52.6 X X windows_aarch64_msvc@0.53.1 X X +windows_i686_gnu@0.52.6 X X windows_i686_gnu@0.53.1 X X +windows_i686_gnullvm@0.52.6 X X windows_i686_gnullvm@0.53.1 X X +windows_i686_msvc@0.52.6 X X windows_i686_msvc@0.53.1 X X +windows_x86_64_gnu@0.52.6 X X windows_x86_64_gnu@0.53.1 X X +windows_x86_64_gnullvm@0.52.6 X X windows_x86_64_gnullvm@0.53.1 X X +windows_x86_64_msvc@0.52.6 X X windows_x86_64_msvc@0.53.1 X X wit-bindgen@0.51.0 X X X writeable@0.6.2 X diff --git a/crates/integration_tests/DEPENDENCIES.rust.tsv b/crates/integration_tests/DEPENDENCIES.rust.tsv index dde113b8af..c036bcbd8f 100644 --- a/crates/integration_tests/DEPENDENCIES.rust.tsv +++ b/crates/integration_tests/DEPENDENCIES.rust.tsv @@ -37,6 +37,7 @@ brotli@8.0.2 X X brotli-decompressor@5.0.0 X X bumpalo@3.20.2 X X bytemuck@1.25.0 X X X +bytemuck_derive@1.10.2 X X X byteorder@1.5.0 X X bytes@1.11.1 X cc@1.2.56 X X @@ -114,11 +115,11 @@ hyper-rustls@0.27.7 X X X hyper-util@0.1.20 X iana-time-zone@0.1.65 X X iana-time-zone-haiku@0.1.2 X X -iceberg@0.9.0 X -iceberg-catalog-rest@0.9.0 X -iceberg-integration-tests@0.9.0 X -iceberg-storage-opendal@0.9.0 X -iceberg_test_utils@0.9.0 X +iceberg@0.9.1 X +iceberg-catalog-rest@0.9.1 X +iceberg-integration-tests@0.9.1 X +iceberg-storage-opendal@0.9.1 X +iceberg_test_utils@0.9.1 X icu_collections@2.1.1 X icu_locale_core@2.1.1 X icu_normalizer@2.1.1 X @@ -153,7 +154,7 @@ libm@0.2.16 X litemap@0.8.1 X lock_api@0.4.14 X X log@0.4.29 X X -lz4_flex@0.12.0 X +lz4_flex@0.12.1 X md-5@0.10.6 X X memchr@2.8.0 X X miniz_oxide@0.8.9 X X X @@ -189,7 +190,7 @@ quick-xml@0.38.4 X quote@1.0.44 X X r-efi@5.3.0 X X X rand@0.8.5 X X -rand@0.9.2 X X +rand@0.9.4 X X rand_chacha@0.3.1 X X rand_chacha@0.9.0 X X rand_core@0.6.4 X X @@ -206,7 +207,7 @@ roaring@0.11.3 X X rustc_version@0.4.1 X X rustls@0.23.37 X X X rustls-pki-types@1.14.0 X X -rustls-webpki@0.103.9 X +rustls-webpki@0.103.12 X rustversion@1.0.22 X X ryu@1.0.23 X X scopeguard@1.2.0 X X @@ -231,6 +232,7 @@ simdutf8@0.1.5 X X slab@0.4.12 X smallvec@1.15.1 X X snap@1.1.1 X +socket2@0.5.10 X X socket2@0.6.2 X X stable_deref_trait@1.2.1 X X strsim@0.11.1 X diff --git a/crates/integrations/cache-moka/DEPENDENCIES.rust.tsv b/crates/integrations/cache-moka/DEPENDENCIES.rust.tsv index 1869491532..70c66a3cb4 100644 --- a/crates/integrations/cache-moka/DEPENDENCIES.rust.tsv +++ b/crates/integrations/cache-moka/DEPENDENCIES.rust.tsv @@ -37,6 +37,7 @@ brotli@8.0.2 X X brotli-decompressor@5.0.0 X X bumpalo@3.20.2 X X bytemuck@1.25.0 X X X +bytemuck_derive@1.10.2 X X X byteorder@1.5.0 X X bytes@1.11.1 X cc@1.2.56 X X @@ -105,9 +106,9 @@ hyper@1.8.1 X hyper-util@0.1.20 X iana-time-zone@0.1.65 X X iana-time-zone-haiku@0.1.2 X X -iceberg@0.9.0 X -iceberg-cache-moka@0.9.0 X -iceberg_test_utils@0.9.0 X +iceberg@0.9.1 X +iceberg-cache-moka@0.9.1 X +iceberg_test_utils@0.9.1 X icu_collections@2.1.1 X icu_locale_core@2.1.1 X icu_normalizer@2.1.1 X @@ -138,7 +139,7 @@ libm@0.2.16 X litemap@0.8.1 X lock_api@0.4.14 X X log@0.4.29 X X -lz4_flex@0.12.0 X +lz4_flex@0.12.1 X memchr@2.8.0 X X miniz_oxide@0.8.9 X X X mio@1.1.1 X @@ -169,11 +170,8 @@ proc-macro2@1.0.106 X X quad-rand@0.2.3 X quote@1.0.44 X X r-efi@5.3.0 X X X -rand@0.8.5 X X -rand@0.9.2 X X -rand_chacha@0.3.1 X X +rand@0.9.4 X X rand_chacha@0.9.0 X X -rand_core@0.6.4 X X rand_core@0.9.5 X X redox_syscall@0.5.18 X regex@1.12.3 X X @@ -205,6 +203,7 @@ simdutf8@0.1.5 X X slab@0.4.12 X smallvec@1.15.1 X X snap@1.1.1 X +socket2@0.5.10 X X socket2@0.6.2 X X stable_deref_trait@1.2.1 X X strsim@0.11.1 X @@ -259,16 +258,26 @@ windows-interface@0.59.3 X X windows-link@0.2.1 X X windows-result@0.4.1 X X windows-strings@0.5.1 X X +windows-sys@0.52.0 X X windows-sys@0.60.2 X X windows-sys@0.61.2 X X +windows-targets@0.52.6 X X windows-targets@0.53.5 X X +windows_aarch64_gnullvm@0.52.6 X X windows_aarch64_gnullvm@0.53.1 X X +windows_aarch64_msvc@0.52.6 X X windows_aarch64_msvc@0.53.1 X X +windows_i686_gnu@0.52.6 X X windows_i686_gnu@0.53.1 X X +windows_i686_gnullvm@0.52.6 X X windows_i686_gnullvm@0.53.1 X X +windows_i686_msvc@0.52.6 X X windows_i686_msvc@0.53.1 X X +windows_x86_64_gnu@0.52.6 X X windows_x86_64_gnu@0.53.1 X X +windows_x86_64_gnullvm@0.52.6 X X windows_x86_64_gnullvm@0.53.1 X X +windows_x86_64_msvc@0.52.6 X X windows_x86_64_msvc@0.53.1 X X wit-bindgen@0.51.0 X X X writeable@0.6.2 X diff --git a/crates/integrations/datafusion/DEPENDENCIES.rust.tsv b/crates/integrations/datafusion/DEPENDENCIES.rust.tsv index d0e79b2b3f..de5d11aa1f 100644 --- a/crates/integrations/datafusion/DEPENDENCIES.rust.tsv +++ b/crates/integrations/datafusion/DEPENDENCIES.rust.tsv @@ -48,6 +48,7 @@ brotli@8.0.2 X X brotli-decompressor@5.0.0 X X bumpalo@3.20.2 X X bytemuck@1.25.0 X X X +bytemuck_derive@1.10.2 X X X byteorder@1.5.0 X X bytes@1.11.1 X bzip2@0.6.1 X X @@ -166,9 +167,9 @@ hyper@1.8.1 X hyper-util@0.1.20 X iana-time-zone@0.1.65 X X iana-time-zone-haiku@0.1.2 X X -iceberg@0.9.0 X -iceberg-datafusion@0.9.0 X -iceberg_test_utils@0.9.0 X +iceberg@0.9.1 X +iceberg-datafusion@0.9.1 X +iceberg_test_utils@0.9.1 X icu_collections@2.1.1 X icu_locale_core@2.1.1 X icu_normalizer@2.1.1 X @@ -205,7 +206,7 @@ linux-raw-sys@0.12.1 X X X litemap@0.8.1 X lock_api@0.4.14 X X log@0.4.29 X X -lz4_flex@0.12.0 X +lz4_flex@0.12.1 X memchr@2.8.0 X X miniz_oxide@0.8.9 X X X mio@1.1.1 X @@ -242,11 +243,8 @@ psm@0.1.30 X X quad-rand@0.2.3 X quote@1.0.44 X X r-efi@5.3.0 X X X -rand@0.8.5 X X -rand@0.9.2 X X -rand_chacha@0.3.1 X X +rand@0.9.4 X X rand_chacha@0.9.0 X X -rand_core@0.6.4 X X rand_core@0.9.5 X X recursive@0.1.1 X recursive-proc-macro-impl@0.1.1 X @@ -284,6 +282,7 @@ siphasher@1.0.2 X X slab@0.4.12 X smallvec@1.15.1 X X snap@1.1.1 X +socket2@0.5.10 X X socket2@0.6.2 X X sqlparser@0.59.0 X sqlparser_derive@0.3.0 X @@ -350,6 +349,7 @@ windows-interface@0.59.3 X X windows-link@0.2.1 X X windows-result@0.4.1 X X windows-strings@0.5.1 X X +windows-sys@0.52.0 X X windows-sys@0.59.0 X X windows-sys@0.60.2 X X windows-sys@0.61.2 X X diff --git a/crates/integrations/playground/DEPENDENCIES.rust.tsv b/crates/integrations/playground/DEPENDENCIES.rust.tsv index 14fa72077e..869641dd7e 100644 --- a/crates/integrations/playground/DEPENDENCIES.rust.tsv +++ b/crates/integrations/playground/DEPENDENCIES.rust.tsv @@ -72,6 +72,7 @@ brotli@8.0.2 X X brotli-decompressor@5.0.0 X X bumpalo@3.20.2 X X bytemuck@1.25.0 X X X +bytemuck_derive@1.10.2 X X X byteorder@1.5.0 X X bytes@1.11.1 X bytes-utils@0.1.4 X X @@ -217,11 +218,11 @@ hyper-rustls@0.27.7 X X X hyper-util@0.1.20 X iana-time-zone@0.1.65 X X iana-time-zone-haiku@0.1.2 X X -iceberg@0.9.0 X -iceberg-catalog-rest@0.9.0 X -iceberg-datafusion@0.9.0 X -iceberg-playground@0.9.0 X -iceberg_test_utils@0.9.0 X +iceberg@0.9.1 X +iceberg-catalog-rest@0.9.1 X +iceberg-datafusion@0.9.1 X +iceberg-playground@0.9.1 X +iceberg_test_utils@0.9.1 X icu_collections@2.1.1 X icu_locale_core@2.1.1 X icu_normalizer@2.1.1 X @@ -262,7 +263,7 @@ linux-raw-sys@0.12.1 X X X litemap@0.8.1 X lock_api@0.4.14 X X log@0.4.29 X X -lz4_flex@0.12.0 X +lz4_flex@0.12.1 X memchr@2.8.0 X X mimalloc@0.1.48 X miniz_oxide@0.8.9 X X X @@ -311,11 +312,8 @@ quick-xml@0.38.4 X quote@1.0.44 X X r-efi@5.3.0 X X X radix_trie@0.2.1 X -rand@0.8.5 X X -rand@0.9.2 X X -rand_chacha@0.3.1 X X +rand@0.9.4 X X rand_chacha@0.9.0 X X -rand_core@0.6.4 X X rand_core@0.9.5 X X recursive@0.1.1 X recursive-proc-macro-impl@0.1.1 X @@ -334,7 +332,7 @@ rustls@0.23.37 X X X rustls-native-certs@0.8.3 X X X rustls-pemfile@2.2.0 X X X rustls-pki-types@1.14.0 X X -rustls-webpki@0.103.9 X +rustls-webpki@0.103.12 X rustversion@1.0.22 X X rustyline@17.0.2 X ryu@1.0.23 X X @@ -366,6 +364,7 @@ siphasher@1.0.2 X X slab@0.4.12 X smallvec@1.15.1 X X snap@1.1.1 X +socket2@0.5.10 X X socket2@0.6.2 X X sqlparser@0.59.0 X sqlparser_derive@0.3.0 X diff --git a/crates/sqllogictest/DEPENDENCIES.rust.tsv b/crates/sqllogictest/DEPENDENCIES.rust.tsv index 5c22a87e56..aa6d0459db 100644 --- a/crates/sqllogictest/DEPENDENCIES.rust.tsv +++ b/crates/sqllogictest/DEPENDENCIES.rust.tsv @@ -54,6 +54,7 @@ brotli@8.0.2 X X brotli-decompressor@5.0.0 X X bumpalo@3.20.2 X X bytemuck@1.25.0 X X X +bytemuck_derive@1.10.2 X X X byteorder@1.5.0 X X bytes@1.11.1 X bzip2@0.6.1 X X @@ -191,10 +192,10 @@ hyper@1.8.1 X hyper-util@0.1.20 X iana-time-zone@0.1.65 X X iana-time-zone-haiku@0.1.2 X X -iceberg@0.9.0 X -iceberg-datafusion@0.9.0 X -iceberg-sqllogictest@0.9.0 X -iceberg_test_utils@0.9.0 X +iceberg@0.9.1 X +iceberg-datafusion@0.9.1 X +iceberg-sqllogictest@0.9.1 X +iceberg_test_utils@0.9.1 X icu_collections@2.1.1 X icu_locale_core@2.1.1 X icu_normalizer@2.1.1 X @@ -235,7 +236,7 @@ linux-raw-sys@0.12.1 X X X litemap@0.8.1 X lock_api@0.4.14 X X log@0.4.29 X X -lz4_flex@0.12.0 X +lz4_flex@0.12.1 X md-5@0.10.6 X X memchr@2.8.0 X X miniz_oxide@0.8.9 X X X @@ -285,7 +286,7 @@ quad-rand@0.2.3 X quote@1.0.44 X X r-efi@5.3.0 X X X rand@0.8.5 X X -rand@0.9.2 X X +rand@0.9.4 X X rand_chacha@0.3.1 X X rand_chacha@0.9.0 X X rand_core@0.6.4 X X @@ -335,6 +336,7 @@ siphasher@1.0.2 X X slab@0.4.12 X smallvec@1.15.1 X X snap@1.1.1 X +socket2@0.5.10 X X socket2@0.6.2 X X sqllogictest@0.28.4 X X sqlparser@0.59.0 X @@ -415,6 +417,7 @@ windows-interface@0.59.3 X X windows-link@0.2.1 X X windows-result@0.4.1 X X windows-strings@0.5.1 X X +windows-sys@0.52.0 X X windows-sys@0.59.0 X X windows-sys@0.60.2 X X windows-sys@0.61.2 X X diff --git a/crates/storage/opendal/DEPENDENCIES.rust.tsv b/crates/storage/opendal/DEPENDENCIES.rust.tsv index c0b8fdf80e..050d7f2de4 100644 --- a/crates/storage/opendal/DEPENDENCIES.rust.tsv +++ b/crates/storage/opendal/DEPENDENCIES.rust.tsv @@ -37,6 +37,7 @@ brotli@8.0.2 X X brotli-decompressor@5.0.0 X X bumpalo@3.20.2 X X bytemuck@1.25.0 X X X +bytemuck_derive@1.10.2 X X X byteorder@1.5.0 X X bytes@1.11.1 X cc@1.2.56 X X @@ -112,9 +113,9 @@ hyper-rustls@0.27.7 X X X hyper-util@0.1.20 X iana-time-zone@0.1.65 X X iana-time-zone-haiku@0.1.2 X X -iceberg@0.9.0 X -iceberg-storage-opendal@0.9.0 X -iceberg_test_utils@0.9.0 X +iceberg@0.9.1 X +iceberg-storage-opendal@0.9.1 X +iceberg_test_utils@0.9.1 X icu_collections@2.1.1 X icu_locale_core@2.1.1 X icu_normalizer@2.1.1 X @@ -148,7 +149,7 @@ libm@0.2.16 X litemap@0.8.1 X lock_api@0.4.14 X X log@0.4.29 X X -lz4_flex@0.12.0 X +lz4_flex@0.12.1 X md-5@0.10.6 X X memchr@2.8.0 X X miniz_oxide@0.8.9 X X X @@ -184,7 +185,7 @@ quick-xml@0.38.4 X quote@1.0.44 X X r-efi@5.3.0 X X X rand@0.8.5 X X -rand@0.9.2 X X +rand@0.9.4 X X rand_chacha@0.3.1 X X rand_chacha@0.9.0 X X rand_core@0.6.4 X X @@ -201,7 +202,7 @@ roaring@0.11.3 X X rustc_version@0.4.1 X X rustls@0.23.37 X X X rustls-pki-types@1.14.0 X X -rustls-webpki@0.103.9 X +rustls-webpki@0.103.12 X rustversion@1.0.22 X X ryu@1.0.23 X X scopeguard@1.2.0 X X @@ -226,6 +227,7 @@ simdutf8@0.1.5 X X slab@0.4.12 X smallvec@1.15.1 X X snap@1.1.1 X +socket2@0.5.10 X X socket2@0.6.2 X X stable_deref_trait@1.2.1 X X strsim@0.11.1 X diff --git a/crates/test_utils/DEPENDENCIES.rust.tsv b/crates/test_utils/DEPENDENCIES.rust.tsv index 850a490d60..9eac41d515 100644 --- a/crates/test_utils/DEPENDENCIES.rust.tsv +++ b/crates/test_utils/DEPENDENCIES.rust.tsv @@ -37,6 +37,7 @@ brotli@8.0.2 X X brotli-decompressor@5.0.0 X X bumpalo@3.20.2 X X bytemuck@1.25.0 X X X +bytemuck_derive@1.10.2 X X X byteorder@1.5.0 X X bytes@1.11.1 X cc@1.2.56 X X @@ -105,8 +106,8 @@ hyper@1.8.1 X hyper-util@0.1.20 X iana-time-zone@0.1.65 X X iana-time-zone-haiku@0.1.2 X X -iceberg@0.9.0 X -iceberg_test_utils@0.9.0 X +iceberg@0.9.1 X +iceberg_test_utils@0.9.1 X icu_collections@2.1.1 X icu_locale_core@2.1.1 X icu_normalizer@2.1.1 X @@ -137,7 +138,7 @@ libm@0.2.16 X litemap@0.8.1 X lock_api@0.4.14 X X log@0.4.29 X X -lz4_flex@0.12.0 X +lz4_flex@0.12.1 X memchr@2.8.0 X X miniz_oxide@0.8.9 X X X mio@1.1.1 X @@ -168,11 +169,8 @@ proc-macro2@1.0.106 X X quad-rand@0.2.3 X quote@1.0.44 X X r-efi@5.3.0 X X X -rand@0.8.5 X X -rand@0.9.2 X X -rand_chacha@0.3.1 X X +rand@0.9.4 X X rand_chacha@0.9.0 X X -rand_core@0.6.4 X X rand_core@0.9.5 X X redox_syscall@0.5.18 X regex@1.12.3 X X @@ -204,6 +202,7 @@ simdutf8@0.1.5 X X slab@0.4.12 X smallvec@1.15.1 X X snap@1.1.1 X +socket2@0.5.10 X X socket2@0.6.2 X X stable_deref_trait@1.2.1 X X strsim@0.11.1 X @@ -258,16 +257,26 @@ windows-interface@0.59.3 X X windows-link@0.2.1 X X windows-result@0.4.1 X X windows-strings@0.5.1 X X +windows-sys@0.52.0 X X windows-sys@0.60.2 X X windows-sys@0.61.2 X X +windows-targets@0.52.6 X X windows-targets@0.53.5 X X +windows_aarch64_gnullvm@0.52.6 X X windows_aarch64_gnullvm@0.53.1 X X +windows_aarch64_msvc@0.52.6 X X windows_aarch64_msvc@0.53.1 X X +windows_i686_gnu@0.52.6 X X windows_i686_gnu@0.53.1 X X +windows_i686_gnullvm@0.52.6 X X windows_i686_gnullvm@0.53.1 X X +windows_i686_msvc@0.52.6 X X windows_i686_msvc@0.53.1 X X +windows_x86_64_gnu@0.52.6 X X windows_x86_64_gnu@0.53.1 X X +windows_x86_64_gnullvm@0.52.6 X X windows_x86_64_gnullvm@0.53.1 X X +windows_x86_64_msvc@0.52.6 X X windows_x86_64_msvc@0.53.1 X X wit-bindgen@0.51.0 X X X writeable@0.6.2 X From 3d369a65ae53b48d7b3bb4679d9ee1d211a229d0 Mon Sep 17 00:00:00 2001 From: Kevin Liu Date: Sun, 22 Mar 2026 18:12:34 -0700 Subject: [PATCH 17/23] Infra: Remove GitHub Actions from Dependabot configuration (#2267) Removed GitHub Actions dependency update configuration. ## Which issue does this PR close? - Closes #. ## What changes are included in this PR? Related to https://github.com/apache/iceberg-python/issues/3186 Dont auto update since we now depend on github action being allowlisted by asf-infra first, https://github.com/apache/infrastructure-actions/blob/main/approved_patterns.yml ## Are these changes tested? (cherry picked from commit cb7f78a25cf6c13a2af7fd295aee31d0560eee39) --- .github/dependabot.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index a94ae0151b..23c9b239ee 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -17,13 +17,6 @@ version: 2 updates: - # Maintain dependencies for GitHub Actions - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "weekly" - day: "sunday" - # Maintain dependencies for iceberg - package-ecosystem: "cargo" directory: "/" From e29ac90b38eb6242d945a631d0bf80052dacd4fb Mon Sep 17 00:00:00 2001 From: Kevin Liu Date: Wed, 15 Apr 2026 12:08:48 -0700 Subject: [PATCH 18/23] ci: fix zizmor workflow (#2334) (cherry picked from commit e285c7957fc6860a654f7da10c92c6d93ac90531) --- .github/workflows/asf-allowlist-check.yml | 46 +++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 .github/workflows/asf-allowlist-check.yml diff --git a/.github/workflows/asf-allowlist-check.yml b/.github/workflows/asf-allowlist-check.yml new file mode 100644 index 0000000000..65dbe8bcbe --- /dev/null +++ b/.github/workflows/asf-allowlist-check.yml @@ -0,0 +1,46 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# Verifies all GitHub Actions refs are on the ASF allowlist. +# Actions not on the allowlist silently fail with "Startup failure" — no logs, +# no notifications, and PRs may appear green because no checks ran. +# See https://github.com/apache/infrastructure-actions/issues/574 +name: "ASF Allowlist Check" + +on: + pull_request: + paths: + - ".github/**" + push: + branches: + - main + paths: + - ".github/**" + +permissions: + contents: read + +jobs: + asf-allowlist-check: + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + persist-credentials: false + - uses: apache/infrastructure-actions/allowlist-check@4e9c961f587f72b170874b6f5cd4ac15f7f26eb8 # main From b6ff8cc8d22903ac7a58868b1c63f566d319ab09 Mon Sep 17 00:00:00 2001 From: Kevin Liu Date: Sun, 29 Mar 2026 18:23:57 -0700 Subject: [PATCH 19/23] ci: improve github workflows (#2289) ## Which issue does this PR close? - Closes #. ## What changes are included in this PR? Relates to https://github.com/apache/iceberg/issues/15742 This PR - Add "ASF allowlist check" - Pin commit for codeql.yml (zizmor recommended) - Add back Github Action auto-update for dependabot (reverts #2267) - Add cooldown to dependabot (zizmor recommended) - `Swatinem/rust-cache@v2` -> `swatinem/rust-cache@v2` (fix case sensitivity) [asf infra allowlist uses lowercase](https://github.com/apache/infrastructure-actions/blob/fae466bc0d9821859a623cbc7648c750ff359ec6/approved_patterns.yml#L271) We can add back dependabot for github action because the "ASF allowlist check" will now alert when an action is not allowed (failures will no longer be silent) ## Are these changes tested? (cherry picked from commit aff502df62c40c977b28ccce83f63f8fb8fccef5) --- .github/dependabot.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 23c9b239ee..03235972dd 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -17,6 +17,15 @@ version: 2 updates: + # Maintain dependencies for GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + day: "sunday" + cooldown: + default-days: 7 + # Maintain dependencies for iceberg - package-ecosystem: "cargo" directory: "/" @@ -35,3 +44,5 @@ updates: patterns: - "arrow*" - "parquet" + cooldown: + default-days: 7 From e17384a854b0497239b43158a5e33fa942db9c82 Mon Sep 17 00:00:00 2001 From: Shawn Chang Date: Wed, 22 Apr 2026 23:22:33 -0700 Subject: [PATCH 20/23] fix: Bump rustls-webpki from 0.103.12 to 0.103.13 to fix RUSTSEC-2026-0104 (#2356) ## Which issue does this PR close? - Closes #. ## What changes are included in this PR? ## Are these changes tested? (cherry picked from commit 4b4ffd0a6a7e3d52f7ea219647407290b0d46e93) --- Cargo.lock | 4 ++-- bindings/python/Cargo.lock | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8cb84bb1f6..56674ac1f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5566,9 +5566,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.12" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "aws-lc-rs", "ring", diff --git a/bindings/python/Cargo.lock b/bindings/python/Cargo.lock index ba75367ca9..72392dd645 100644 --- a/bindings/python/Cargo.lock +++ b/bindings/python/Cargo.lock @@ -3687,9 +3687,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.10" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "ring", "rustls-pki-types", From 990a878c936bd73b59afe95381bda6118f51d190 Mon Sep 17 00:00:00 2001 From: Shawn Chang Date: Wed, 22 Apr 2026 16:24:38 -0700 Subject: [PATCH 21/23] Update CHANGELOG for 0.9.1 --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54bb48a8ab..c32a179dbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,27 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/) and this project adheres to [Semantic Versioning](https://semver.org/). +## [v0.9.1] - 2026-04-23 + +### All Changes + +* ci: improve github workflows (#2289) by @kevinjqliu in https://github.com/apache/iceberg-rust/pull/2289 +* ci: fix zizmor workflow (#2334) by @kevinjqliu in https://github.com/apache/iceberg-rust/pull/2334 +* Infra: Remove GitHub Actions from Dependabot configuration (#2267) by @kevinjqliu in https://github.com/apache/iceberg-rust/pull/2267 +* chore: update comment tag to match the exact version to fix zizmor (#2333) by @CTTY in https://github.com/apache/iceberg-rust/pull/2333 +* Fix zizmor workflow (#2324) by @blackmwk in https://github.com/apache/iceberg-rust/pull/2324 +* ci: ensure use bash shell for env (#2305) by @kevinjqliu in https://github.com/apache/iceberg-rust/pull/2305 +* ci: fix zizmor security findings (#2290) by @kevinjqliu in https://github.com/apache/iceberg-rust/pull/2290 +* chore: Change publish parallism back to 1 (#2254) by @CTTY in https://github.com/apache/iceberg-rust/pull/2254 +* Fix RUSTSEC-2026-0097 (#2331) by @blackmwk in https://github.com/apache/iceberg-rust/pull/2331 +* chore(deps): Bump rustls-webpki from 0.103.7 to 0.103.10 in bindings/python (#2278) by @blackmwk in https://github.com/apache/iceberg-rust/pull/2278 +* chore(deps): fix audit check and disable inherited aws sdk default features (#2274) by @maybe-vibe in https://github.com/apache/iceberg-rust/pull/2274 +* fix(s3tables): use 's3' as the default scheme (#2313) by @rchowell in https://github.com/apache/iceberg-rust/pull/2313 +* fix: incorrect Parquet INT96 timestamp values from ArrowReader (#2301) by @mbutrovich in https://github.com/apache/iceberg-rust/pull/2301 +* fix: build_fallback_field_id_map produces incorrect column indices for schemas with nested types (#2307) by @mbutrovich in https://github.com/apache/iceberg-rust/pull/2307 +* fix: explicitly set Python interpreter in maturin build to prevent using wrong version (#2277) by @kevinjqliu in https://github.com/apache/iceberg-rust/pull/2277 +* fix: Bump rustls-webpki from 0.103.12 to 0.103.13 to fix RUSTSEC-2026-0104 (#2356) by @CTTY in https://github.com/apache/iceberg-rust/pull/2356 + ## [v0.9.0] - 2026-03-10 ### Breaking Changes From bf0b6e377a606c8c2da1153240400d21d6afb0d1 Mon Sep 17 00:00:00 2001 From: Shawn Chang Date: Thu, 23 Apr 2026 14:40:06 -0700 Subject: [PATCH 22/23] Generate dep list for 0.9.1 --- bindings/python/DEPENDENCIES.rust.tsv | 2 +- crates/catalog/glue/DEPENDENCIES.rust.tsv | 2 +- crates/catalog/hms/DEPENDENCIES.rust.tsv | 2 +- crates/catalog/loader/DEPENDENCIES.rust.tsv | 2 +- crates/catalog/s3tables/DEPENDENCIES.rust.tsv | 2 +- crates/catalog/sql/DEPENDENCIES.rust.tsv | 2 +- crates/integration_tests/DEPENDENCIES.rust.tsv | 2 +- crates/integrations/playground/DEPENDENCIES.rust.tsv | 2 +- crates/storage/opendal/DEPENDENCIES.rust.tsv | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bindings/python/DEPENDENCIES.rust.tsv b/bindings/python/DEPENDENCIES.rust.tsv index 2893978e75..f7485d1de3 100644 --- a/bindings/python/DEPENDENCIES.rust.tsv +++ b/bindings/python/DEPENDENCIES.rust.tsv @@ -295,7 +295,7 @@ rustc_version@0.4.1 X X rustix@1.1.2 X X X rustls@0.23.34 X X X rustls-pki-types@1.13.0 X X -rustls-webpki@0.103.10 X +rustls-webpki@0.103.13 X rustversion@1.0.22 X X ryu@1.0.20 X X same-file@1.0.6 X X diff --git a/crates/catalog/glue/DEPENDENCIES.rust.tsv b/crates/catalog/glue/DEPENDENCIES.rust.tsv index 530e7f27cb..390dbaf93d 100644 --- a/crates/catalog/glue/DEPENDENCIES.rust.tsv +++ b/crates/catalog/glue/DEPENDENCIES.rust.tsv @@ -233,7 +233,7 @@ roaring@0.11.3 X X rustc_version@0.4.1 X X rustls@0.23.37 X X X rustls-pki-types@1.14.0 X X -rustls-webpki@0.103.12 X +rustls-webpki@0.103.13 X rustversion@1.0.22 X X ryu@1.0.23 X X scopeguard@1.2.0 X X diff --git a/crates/catalog/hms/DEPENDENCIES.rust.tsv b/crates/catalog/hms/DEPENDENCIES.rust.tsv index cceb335d86..f1ebd2cba6 100644 --- a/crates/catalog/hms/DEPENDENCIES.rust.tsv +++ b/crates/catalog/hms/DEPENDENCIES.rust.tsv @@ -230,7 +230,7 @@ rustc-hash@2.1.1 X X rustc_version@0.4.1 X X rustls@0.23.37 X X X rustls-pki-types@1.14.0 X X -rustls-webpki@0.103.12 X +rustls-webpki@0.103.13 X rustversion@1.0.22 X X ryu@1.0.23 X X scopeguard@1.2.0 X X diff --git a/crates/catalog/loader/DEPENDENCIES.rust.tsv b/crates/catalog/loader/DEPENDENCIES.rust.tsv index 4b620d08a0..7540b377a2 100644 --- a/crates/catalog/loader/DEPENDENCIES.rust.tsv +++ b/crates/catalog/loader/DEPENDENCIES.rust.tsv @@ -275,7 +275,7 @@ rustc-hash@2.1.1 X X rustc_version@0.4.1 X X rustls@0.23.37 X X X rustls-pki-types@1.14.0 X X -rustls-webpki@0.103.12 X +rustls-webpki@0.103.13 X rustversion@1.0.22 X X ryu@1.0.23 X X scopeguard@1.2.0 X X diff --git a/crates/catalog/s3tables/DEPENDENCIES.rust.tsv b/crates/catalog/s3tables/DEPENDENCIES.rust.tsv index ae37609611..a5c8bc1371 100644 --- a/crates/catalog/s3tables/DEPENDENCIES.rust.tsv +++ b/crates/catalog/s3tables/DEPENDENCIES.rust.tsv @@ -233,7 +233,7 @@ roaring@0.11.3 X X rustc_version@0.4.1 X X rustls@0.23.37 X X X rustls-pki-types@1.14.0 X X -rustls-webpki@0.103.12 X +rustls-webpki@0.103.13 X rustversion@1.0.22 X X ryu@1.0.23 X X scopeguard@1.2.0 X X diff --git a/crates/catalog/sql/DEPENDENCIES.rust.tsv b/crates/catalog/sql/DEPENDENCIES.rust.tsv index 37ff2c0b91..1a3e435120 100644 --- a/crates/catalog/sql/DEPENDENCIES.rust.tsv +++ b/crates/catalog/sql/DEPENDENCIES.rust.tsv @@ -196,7 +196,7 @@ roaring@0.11.3 X X rustc_version@0.4.1 X X rustls@0.23.37 X X X rustls-pki-types@1.14.0 X X -rustls-webpki@0.103.12 X +rustls-webpki@0.103.13 X rustversion@1.0.22 X X ryu@1.0.23 X X scopeguard@1.2.0 X X diff --git a/crates/integration_tests/DEPENDENCIES.rust.tsv b/crates/integration_tests/DEPENDENCIES.rust.tsv index c036bcbd8f..aa122e84e4 100644 --- a/crates/integration_tests/DEPENDENCIES.rust.tsv +++ b/crates/integration_tests/DEPENDENCIES.rust.tsv @@ -207,7 +207,7 @@ roaring@0.11.3 X X rustc_version@0.4.1 X X rustls@0.23.37 X X X rustls-pki-types@1.14.0 X X -rustls-webpki@0.103.12 X +rustls-webpki@0.103.13 X rustversion@1.0.22 X X ryu@1.0.23 X X scopeguard@1.2.0 X X diff --git a/crates/integrations/playground/DEPENDENCIES.rust.tsv b/crates/integrations/playground/DEPENDENCIES.rust.tsv index 869641dd7e..3e110e2a57 100644 --- a/crates/integrations/playground/DEPENDENCIES.rust.tsv +++ b/crates/integrations/playground/DEPENDENCIES.rust.tsv @@ -332,7 +332,7 @@ rustls@0.23.37 X X X rustls-native-certs@0.8.3 X X X rustls-pemfile@2.2.0 X X X rustls-pki-types@1.14.0 X X -rustls-webpki@0.103.12 X +rustls-webpki@0.103.13 X rustversion@1.0.22 X X rustyline@17.0.2 X ryu@1.0.23 X X diff --git a/crates/storage/opendal/DEPENDENCIES.rust.tsv b/crates/storage/opendal/DEPENDENCIES.rust.tsv index 050d7f2de4..c1d38545e1 100644 --- a/crates/storage/opendal/DEPENDENCIES.rust.tsv +++ b/crates/storage/opendal/DEPENDENCIES.rust.tsv @@ -202,7 +202,7 @@ roaring@0.11.3 X X rustc_version@0.4.1 X X rustls@0.23.37 X X X rustls-pki-types@1.14.0 X X -rustls-webpki@0.103.12 X +rustls-webpki@0.103.13 X rustversion@1.0.22 X X ryu@1.0.23 X X scopeguard@1.2.0 X X From a78bd0dd02734bf53bec7d47624a5adb4409f1d3 Mon Sep 17 00:00:00 2001 From: Shawn Chang Date: Mon, 27 Apr 2026 13:10:44 -0700 Subject: [PATCH 23/23] Bump pyiceberg_core_rust version to 0.9.1 --- bindings/python/Cargo.lock | 2 +- bindings/python/Cargo.toml | 2 +- bindings/python/DEPENDENCIES.rust.tsv | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bindings/python/Cargo.lock b/bindings/python/Cargo.lock index 72392dd645..dc85aed0d0 100644 --- a/bindings/python/Cargo.lock +++ b/bindings/python/Cargo.lock @@ -3209,7 +3209,7 @@ dependencies = [ [[package]] name = "pyiceberg_core_rust" -version = "0.9.0" +version = "0.9.1" dependencies = [ "arrow", "datafusion-ffi", diff --git a/bindings/python/Cargo.toml b/bindings/python/Cargo.toml index 4813c72db7..317adb028f 100644 --- a/bindings/python/Cargo.toml +++ b/bindings/python/Cargo.toml @@ -20,7 +20,7 @@ edition = "2024" homepage = "https://rust.iceberg.apache.org" name = "pyiceberg_core_rust" rust-version = "1.92" -version = "0.9.0" +version = "0.9.1" # This crate is used to build python bindings, we don't want to publish it publish = false diff --git a/bindings/python/DEPENDENCIES.rust.tsv b/bindings/python/DEPENDENCIES.rust.tsv index f7485d1de3..04180cf8f9 100644 --- a/bindings/python/DEPENDENCIES.rust.tsv +++ b/bindings/python/DEPENDENCIES.rust.tsv @@ -263,7 +263,7 @@ proc-macro2@1.0.103 X X prost@0.14.1 X prost-derive@0.14.1 X psm@0.1.28 X X -pyiceberg_core_rust@0.9.0 X +pyiceberg_core_rust@0.9.1 X pyo3@0.26.0 X X pyo3-build-config@0.26.0 X X pyo3-ffi@0.26.0 X X