From bc9cef241e2567884532a8f01fbefc7180649245 Mon Sep 17 00:00:00 2001 From: Andy Grove Date: Mon, 26 Oct 2026 07:24:06 -0600 Subject: [PATCH 1/9] deps: use DataFusion main (350ca76) with Arrow/Parquet 60 and object_store 0.14 Point the DataFusion dependencies at a git revision of apache/datafusion main (350ca76505c9513d16e7dd9910bcd9bde2c911ed), which is on arrow/parquet 60.0.0 and object_store 0.14.2. Bump arrow, parquet, object_store and object_store_opendal (0.59.0, the first release on object_store 0.14) to match. iceberg-rust main is still on arrow 59, and the head of apache/iceberg-rust#3257 (Arrow 60) is 42 commits behind the main revision Comet builds against. Pin iceberg and iceberg-storage-opendal to a branch on the andygrove/iceberg-rust fork that merges apache/iceberg-rust main (1f3bc34) into that PR. Source changes for the new APIs: - Arrow 60 makes the FFI_ArrowArrayStream callbacks private, so the decimal-realignment test builds the import with from_ffi_and_data_type. - Parquet 60 moves the page index behind ParquetMetaData::page_index(), a PageIndexProvider with per-row-group access. - DataFusion's coerce_int96 and coerce_int96_tz are typed (DFTimeUnit, ConfigTimeZone) instead of strings. - OffsetBuffer::first/last return values and schema metadata is arrow's Metadata type. - HashJoinExec::with_dynamic_filter_expr, SortExec::with_dynamic_filter_expr, ExecutionPlan::with_preserve_order and ParquetAccessPlan::into_overall_row_selection are deprecated; allow them where Comet still needs them. - Arrow 60's MapBuilder names map children key/value by default, so make_map_c names them keys/values explicitly to keep exercising non-canonical names. - datafusion-spark's SparkXxhash64 now ignores the hidden children of a NULL struct and keeps the running hash for nested dictionaries (apache/datafusion #25774, #25813), so the tests that pinned those differences assert equality. --- contrib/delta/native/Cargo.lock | 285 ++++++------ contrib/delta/native/Cargo.toml | 2 +- contrib/lance/native/Cargo.toml | 2 +- native/Cargo.lock | 407 ++++++++---------- native/Cargo.toml | 32 +- native/comet-test-udfs/src/lib.rs | 40 +- native/core/Cargo.toml | 4 +- native/core/src/execution/delta_dv.rs | 37 +- .../operators/dynamic_filter/join.rs | 8 +- .../operators/dynamic_filter/topk.rs | 3 + .../dynamic_filter/topk/reader/tests.rs | 7 +- native/core/src/execution/operators/scan.rs | 109 ++--- native/core/src/execution/utils.rs | 6 +- .../src/parquet/cast_column/variant/tests.rs | 30 +- native/core/src/parquet/datetime_rebase.rs | 13 +- .../eager_page_index_reader_factory.rs | 21 +- native/core/src/parquet/parquet_exec.rs | 22 +- native/core/src/parquet/parquet_support.rs | 2 +- native/core/src/parquet/schema_adapter.rs | 5 +- native/operators/src/metric_owning.rs | 7 +- native/shuffle/src/ipc.rs | 9 +- native/spark-expr/benches/list_extract.rs | 4 +- native/spark-expr/benches/map_extract.rs | 2 +- .../src/array_funcs/list_extract.rs | 2 +- .../src/array_funcs/list_positions.rs | 4 +- native/spark-expr/src/hash_funcs/xxhash64.rs | 8 +- .../src/hash_funcs/xxhash64_diff.rs | 24 +- native/spark-expr/src/map_funcs/map_sort.rs | 4 +- native/spark-expr/src/nested_compaction.rs | 6 +- 29 files changed, 549 insertions(+), 556 deletions(-) diff --git a/contrib/delta/native/Cargo.lock b/contrib/delta/native/Cargo.lock index 1ad7524bad0..4e4a1f10a5d 100644 --- a/contrib/delta/native/Cargo.lock +++ b/contrib/delta/native/Cargo.lock @@ -27,15 +27,15 @@ dependencies = [ [[package]] name = "alloc-no-stdlib" -version = "2.0.4" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" +checksum = "c2fb6cfd47bf496ff64095c20eaba0c201404ee38714d4142fcfa1dc334fcc7a" [[package]] name = "alloc-stdlib" -version = "0.2.4" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +checksum = "0b5c1865780388bfa186411ab5f247819487fc4864c6e9c3106611fa347586e1" dependencies = [ "alloc-no-stdlib", ] @@ -63,9 +63,9 @@ checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "arrow" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c25317ebddb8f2e6f006759336c95e5ded847a446f3524c27853bfe7d77a69b" +checksum = "234ce58e76c04e8162c2e4bc3fe53fa7c2418ef5fba7bb2838b8531b7d4fbf14" dependencies = [ "arrow-arith", "arrow-array", @@ -84,9 +84,9 @@ dependencies = [ [[package]] name = "arrow-arith" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab555c0ffe9cb817041c0cee80baa9663a22225d0a035693579771f2693cadc" +checksum = "2303ebedb1071f4f72d71171e383859a9a285c94d99e4892685a96fca9890720" dependencies = [ "arrow-array", "arrow-buffer", @@ -98,9 +98,9 @@ dependencies = [ [[package]] name = "arrow-array" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dae1d91737421e92c6dd7c7f9d0f2d25198fd6fc539738b628f4dad10adf533" +checksum = "51dff6e4b9f158864a0aeb6a131ad53858ecbae7a2fc8989307b9b3c6b2f122e" dependencies = [ "ahash", "arrow-buffer", @@ -117,9 +117,9 @@ dependencies = [ [[package]] name = "arrow-buffer" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fe9cd0064f2d7cf8ecfaf77cd70e67a980bc71aea92b63102bd37a7d3379a09" +checksum = "c7235b863533e9db3ab86905b4521251de11226275b436ff3cb2d0010558d1c5" dependencies = [ "bytes", "half", @@ -129,9 +129,9 @@ dependencies = [ [[package]] name = "arrow-cast" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee510bc252781d700400979a96bd1eadebeae23901132bbabd92118da1b376c5" +checksum = "d52cf840f0c34aeeb7e8b05aba72d66878e6c001827f423331f0b260209e7b7e" dependencies = [ "arrow-array", "arrow-buffer", @@ -149,11 +149,22 @@ dependencies = [ "ryu", ] +[[package]] +name = "arrow-cmp" +version = "60.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73a0e9adb28d95739fabcdae637261a2c14e618caf58ba1b88857120f9ee2687" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-schema", +] + [[package]] name = "arrow-csv" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace83d5935421b950fea3a0a3f9972c0837c297ef98ade57127a5661b681112c" +checksum = "2ad83176cc677f996096d694a3cccd7310069faeee4b3df9e2dabf92fdcf8b4b" dependencies = [ "arrow-array", "arrow-cast", @@ -166,9 +177,9 @@ dependencies = [ [[package]] name = "arrow-data" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54f128c73bb7fe9f7137218f910edd5b436f390e0f040b1956f5028390787897" +checksum = "5aa06d5e22786c4966ffc4d2f171d0cb65d95f6bdea108a14e8c335e9faa437f" dependencies = [ "arrow-buffer", "arrow-schema", @@ -179,9 +190,9 @@ dependencies = [ [[package]] name = "arrow-ipc" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e244f39b82fa7a823e8b5984a0bd988234f9c92c1df79378fb85090e6e4c821" +checksum = "86c523472d22e31f984df7a44fc36e6323d3c9b05ffe53d267ee4c3aa7c128d2" dependencies = [ "arrow-array", "arrow-buffer", @@ -195,9 +206,9 @@ dependencies = [ [[package]] name = "arrow-json" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727b21ebf8894dcd9504d6ab66bffdac338391e1f85cde594526a0210299ea40" +checksum = "342fc6600a93a48038d853431803c941436b7b51f756763e76cad9784b7e3718" dependencies = [ "arrow-array", "arrow-buffer", @@ -220,12 +231,13 @@ dependencies = [ [[package]] name = "arrow-ord" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d376b9b883239ae0f9963cdeeb59126ccaac08d60adf208a6ad3e2dd4048c3" +checksum = "5a7ac2c6a9cdc782fa9548d3763461eaec8c93347e297fddbaa44807e70a3698" dependencies = [ "arrow-array", "arrow-buffer", + "arrow-cmp", "arrow-data", "arrow-schema", "arrow-select", @@ -233,9 +245,9 @@ dependencies = [ [[package]] name = "arrow-row" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48096811f92b5c3a0c59d33cfecd7d7d2ed037d81e54a27a42d232e7700e6de2" +checksum = "758b87e9648d80001e0916c083334ed93074c677a81a96144d5c84bd2d8eab2a" dependencies = [ "arrow-array", "arrow-buffer", @@ -246,9 +258,9 @@ dependencies = [ [[package]] name = "arrow-schema" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b6c8a6b12cf3869d299ce36ed8e1cd6fe9836264b68fb6c6538473a36124a1" +checksum = "f85a9a58cd03560526b0066487574aacb9008e413504fa0ee23d61141e96c338" dependencies = [ "serde_core", "serde_json", @@ -256,13 +268,14 @@ dependencies = [ [[package]] name = "arrow-select" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e523e85fa9fb3181a391bf0edfa6a1ae0dc46df8cbf7f6b96034dcb1e2a7a04a" +checksum = "ba3482b7d03bf4a3bf0b195f08a7f2b071595ccd54897e35b975ac63d3104977" dependencies = [ "ahash", "arrow-array", "arrow-buffer", + "arrow-cmp", "arrow-data", "arrow-schema", "num-traits", @@ -270,9 +283,9 @@ dependencies = [ [[package]] name = "arrow-string" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b931a905a0e4b8832d9f54fb369cf6e545f9dc03cb3d9611216a7bd2653df60a" +checksum = "f300b4400b1e7cd58f7cbbd5dd2a0072cc59e73bfaee2a152b3ac660e46d9dd1" dependencies = [ "arrow-array", "arrow-buffer", @@ -298,9 +311,9 @@ dependencies = [ [[package]] name = "atoi" -version = "2.0.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +checksum = "d12c37257553c19e9aee6cba77814fdc9e07844abfc8b3a2c377cd920ee5a993" dependencies = [ "num-traits", ] @@ -325,9 +338,9 @@ checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" [[package]] name = "brotli" -version = "8.0.4" +version = "9.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" +checksum = "6737ce8b81460bf9407909f73ff50bf13f7cb8577e1e76715f57ed0eba58ba44" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -336,9 +349,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "5.0.3" +version = "6.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +checksum = "34c6783f42c21c952ad7112b354f0ba2f10760e9decea5b1b60523d6e270faaf" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -374,6 +387,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + [[package]] name = "chrono" version = "0.4.45" @@ -405,9 +424,9 @@ dependencies = [ [[package]] name = "comfy-table" -version = "7.2.2" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958c5d6ecf1f214b4c2bbbbf6ab9523a864bd136dcf71a7e8904799acfe1ad47" +checksum = "b96a46ad395a5e00676eddaca4a45ed78b29c08be5a878d35e4b071c625637dd" dependencies = [ "unicode-segmentation", "unicode-width", @@ -488,9 +507,8 @@ dependencies = [ [[package]] name = "datafusion" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd5317db77ba6bca25c761a8091b9d294a9f4188e4f9dcd0243e6a57de862ac" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-schema", @@ -534,9 +552,8 @@ dependencies = [ [[package]] name = "datafusion-catalog" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f35d36794509b7bfcbf90e11a1b5e4d047123c34610105e2e80a2048351cdb2f" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "async-trait", @@ -559,9 +576,8 @@ dependencies = [ [[package]] name = "datafusion-catalog-listing" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6454bfb7f43b83942e2ca2576fd09342eedbd0d323e1eef72c3c8e4d57d7203" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "async-trait", @@ -591,9 +607,8 @@ dependencies = [ [[package]] name = "datafusion-common" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26626e12b224b83351239465dcd00f72d47b02fb5e5b65a643e2dc8ed37f687" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-ipc", @@ -616,9 +631,8 @@ dependencies = [ [[package]] name = "datafusion-common-runtime" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a106420cbfa980f242c22243ae9a6cce661d4d86ce96cff87dacabf7754a4470" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "futures", "log", @@ -627,9 +641,8 @@ dependencies = [ [[package]] name = "datafusion-datasource" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "210aa1e9525e9454f2399dbb8b0b95510145bd8c1fdc35de74e9ccbf81bcb699" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "async-trait", @@ -650,6 +663,7 @@ dependencies = [ "log", "object_store", "parking_lot", + "pin-project-lite", "rand", "tokio", "url", @@ -657,9 +671,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-arrow" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65b1b041688cad707fa103c3e7f4c6d89b3134ebf67da0129070dad3381851eb" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-ipc", @@ -681,9 +694,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-csv" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a7b34e253c4fa5251f174977af910a2f2ec831ec39dbbb56b29ce505cff278b" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "async-trait", @@ -704,9 +716,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-json" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1663338f43be6a5746473008e2d0fbde282577ddf0bae90d6c7386e988d71b29" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "async-trait", @@ -727,9 +738,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-parquet" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c521ae91b6d899d7190812881f45fe9463c222c11d90149f5332a2e56555904" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-schema", @@ -759,15 +769,13 @@ dependencies = [ [[package]] name = "datafusion-doc" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2569c2e74a34fcae3a369ab3912d61e41a062592510f11e31b1dae2725ecdc" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" [[package]] name = "datafusion-execution" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cfdd5ac0769d1e74a885450e49fde8f63ca7ab41eb479a068564aaea80b837" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-buffer", @@ -791,9 +799,8 @@ dependencies = [ [[package]] name = "datafusion-expr" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86560fd7df4dda924f5474b588c56e7ae8e96dcf158c7327c9cfe9daff448ec5" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-schema", @@ -813,9 +820,8 @@ dependencies = [ [[package]] name = "datafusion-expr-common" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e82e313cf655cf6bc2dce6cbd23bcb0d20236a54a1b09c436615e4bac4d8c49f" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "datafusion-common", @@ -825,12 +831,12 @@ dependencies = [ [[package]] name = "datafusion-functions" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "939ae2771da8a3fdc23ab4de610ae8fef9515476626b49d96d0d5c782b105771" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-buffer", + "arrow-select", "base64", "chrono", "chrono-tz", @@ -853,11 +859,11 @@ dependencies = [ [[package]] name = "datafusion-functions-aggregate" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6c3aee9f2bc65716787d651e023743a90b4efbc57a2f679f036632e16fb110" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", + "arrow-select", "datafusion-common", "datafusion-doc", "datafusion-execution", @@ -868,15 +874,15 @@ dependencies = [ "datafusion-physical-expr-common", "half", "hashbrown 0.17.1", + "itertools 0.15.0", "log", "num-traits", ] [[package]] name = "datafusion-functions-aggregate-common" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "988b5d3dfb4939d81c2f9fab267063610fe52a843620f2fa6cb2a1598e43369c" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "datafusion-common", @@ -886,9 +892,8 @@ dependencies = [ [[package]] name = "datafusion-functions-table" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c767567cce2782d4d0bdfa55fab010aaba0bdbe533509e9e0b9a6a3ee29ed59" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "async-trait", @@ -902,9 +907,8 @@ dependencies = [ [[package]] name = "datafusion-functions-window" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a311c1f558d1f792f1f631c3670da12ee72a20fbf5d6ca151325d66191c03c1" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "datafusion-common", @@ -919,9 +923,8 @@ dependencies = [ [[package]] name = "datafusion-functions-window-common" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffd54b8acf6ecef284cc0677e01e1b8c71be64fec50612ba00a0ff0d9b41a52" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "datafusion-common", "datafusion-physical-expr-common", @@ -929,9 +932,8 @@ dependencies = [ [[package]] name = "datafusion-macros" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d6df9763c8fb968b2417d797aef4c55ac2e4a895aaef38c72c16a287aa4a40" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "datafusion-doc", "quote", @@ -940,9 +942,8 @@ dependencies = [ [[package]] name = "datafusion-optimizer" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfb8cea6e05e2e75bae183340cf7d53cccb3db0449e2f1fbc07654d980fd19f" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "chrono", @@ -959,9 +960,8 @@ dependencies = [ [[package]] name = "datafusion-physical-expr" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f002cef849e10c0597a217ec7891c2796c0f8b42d739f5d24abc24496373406" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-schema", @@ -976,14 +976,14 @@ dependencies = [ "itertools 0.15.0", "parking_lot", "petgraph", + "regex", "tokio", ] [[package]] name = "datafusion-physical-expr-adapter" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82761522c4536e7059d3b185cd99f10525c2bf48f1bd26a0a57e73e19eadc0fb" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "datafusion-common", @@ -996,9 +996,8 @@ dependencies = [ [[package]] name = "datafusion-physical-expr-common" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5c67aa252886f4d6b331c8114797f5b140464e774c4da36889269a1bf1bd8" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "chrono", @@ -1009,19 +1008,20 @@ dependencies = [ "itertools 0.15.0", "parking_lot", "pin-project", + "regex", ] [[package]] name = "datafusion-physical-optimizer" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a49dd3a76e4879012682c59dc3735282e60640c97483546a4113564a60bf8f" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "datafusion-common", "datafusion-execution", "datafusion-expr", "datafusion-expr-common", + "datafusion-functions-window", "datafusion-physical-expr", "datafusion-physical-expr-common", "datafusion-physical-plan", @@ -1032,9 +1032,8 @@ dependencies = [ [[package]] name = "datafusion-physical-plan" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1451d6817e5ac0dd21819b19949d1c420ab51d748f55dd9a96ecb5418a24c97" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-data", @@ -1047,6 +1046,7 @@ dependencies = [ "datafusion-common-runtime", "datafusion-execution", "datafusion-expr", + "datafusion-expr-common", "datafusion-functions", "datafusion-functions-aggregate-common", "datafusion-functions-window-common", @@ -1068,9 +1068,8 @@ dependencies = [ [[package]] name = "datafusion-pruning" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f11f0dbe2b5a642f6106e44de8bbd6654fa7220ca14f32313d4efd5514a86968" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "datafusion-common", @@ -1084,9 +1083,8 @@ dependencies = [ [[package]] name = "datafusion-session" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62dc5ce37a5ce1ff5362949776829aded2529a11dbaa13d24b0ffa6a059e106a" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow-schema", "async-trait", @@ -1094,6 +1092,7 @@ dependencies = [ "datafusion-execution", "datafusion-expr", "datafusion-physical-plan", + "futures", "parking_lot", ] @@ -1682,6 +1681,18 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" +[[package]] +name = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "num-bigint" version = "0.5.1" @@ -1722,9 +1733,9 @@ dependencies = [ [[package]] name = "object_store" -version = "0.13.2" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622acbc9100d3c10e2ee15804b0caa40e55c933d5aa53814cd520805b7958a49" +checksum = "f1796bc93603f78c5760a69f2d58badc9618d22adade0a95385bb2adbae4eb94" dependencies = [ "async-trait", "bytes", @@ -1734,7 +1745,8 @@ dependencies = [ "futures-util", "http", "humantime", - "itertools 0.14.0", + "itertools 0.15.0", + "nix", "parking_lot", "percent-encoding", "thiserror", @@ -1744,6 +1756,7 @@ dependencies = [ "walkdir", "wasm-bindgen-futures", "web-time", + "windows-sys", ] [[package]] @@ -1777,9 +1790,9 @@ dependencies = [ [[package]] name = "parquet" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b3d2ef0fb136e9341570f219ecb168902e76079c6d81ad555f0a4840b1e08a3" +checksum = "8af83d2940bc0510f9aef86d865f56fdc6095f87ab115ac885a80b7c5226d3ba" dependencies = [ "ahash", "arrow-array", @@ -2712,18 +2725,18 @@ checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] name = "zstd" -version = "0.13.3" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +checksum = "db3ae9bf90af6e40197bef767eeefc46ad6397420fe873830bd85e5fbbfb3c70" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.3.0" +version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d80649ab6db9d9f6f9c80a40becd948eda4714a0a5ac8c4d157a32231c7882" +checksum = "ded520f16b29e1a9b771c722221b2b0a0398c2316d9bb3c42b458a5414d7434b" dependencies = [ "zstd-sys", ] diff --git a/contrib/delta/native/Cargo.toml b/contrib/delta/native/Cargo.toml index 2a5ae5b66c6..e08f819c951 100644 --- a/contrib/delta/native/Cargo.toml +++ b/contrib/delta/native/Cargo.toml @@ -47,4 +47,4 @@ crate-type = ["rlib"] datafusion-comet-proto = { path = "../../../native/proto" } # For `ExecutionPlan` (return type), `SchemaRef` (the shim hands these in), and `DataFusionError` # (the not-implemented error). Versions/features mirror core so the shared lockfile resolves cleanly. -datafusion = { version = "55.2.0", default-features = false, features = ["parquet"] } +datafusion = { git = "https://github.com/apache/datafusion", rev = "350ca76505c9513d16e7dd9910bcd9bde2c911ed", default-features = false, features = ["parquet"] } diff --git a/contrib/lance/native/Cargo.toml b/contrib/lance/native/Cargo.toml index 0cb7aebeca6..7d032c13326 100644 --- a/contrib/lance/native/Cargo.toml +++ b/contrib/lance/native/Cargo.toml @@ -28,5 +28,5 @@ license = "Apache-2.0" crate-type = ["rlib"] [dependencies] -datafusion = { version = "55.0.0", default-features = false } +datafusion = { git = "https://github.com/apache/datafusion", rev = "350ca76505c9513d16e7dd9910bcd9bde2c911ed", default-features = false } datafusion-comet-proto = { path = "../../../native/proto" } diff --git a/native/Cargo.lock b/native/Cargo.lock index 15b798316e0..817ea8c43aa 100644 --- a/native/Cargo.lock +++ b/native/Cargo.lock @@ -92,15 +92,15 @@ dependencies = [ [[package]] name = "alloc-no-stdlib" -version = "2.0.4" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" +checksum = "c2fb6cfd47bf496ff64095c20eaba0c201404ee38714d4142fcfa1dc334fcc7a" [[package]] name = "alloc-stdlib" -version = "0.2.4" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +checksum = "0b5c1865780388bfa186411ab5f247819487fc4864c6e9c3106611fa347586e1" dependencies = [ "alloc-no-stdlib", ] @@ -232,9 +232,9 @@ checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" [[package]] name = "arrow" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c25317ebddb8f2e6f006759336c95e5ded847a446f3524c27853bfe7d77a69b" +checksum = "234ce58e76c04e8162c2e4bc3fe53fa7c2418ef5fba7bb2838b8531b7d4fbf14" dependencies = [ "arrow-arith", "arrow-array", @@ -253,9 +253,9 @@ dependencies = [ [[package]] name = "arrow-arith" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab555c0ffe9cb817041c0cee80baa9663a22225d0a035693579771f2693cadc" +checksum = "2303ebedb1071f4f72d71171e383859a9a285c94d99e4892685a96fca9890720" dependencies = [ "arrow-array", "arrow-buffer", @@ -267,9 +267,9 @@ dependencies = [ [[package]] name = "arrow-array" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dae1d91737421e92c6dd7c7f9d0f2d25198fd6fc539738b628f4dad10adf533" +checksum = "51dff6e4b9f158864a0aeb6a131ad53858ecbae7a2fc8989307b9b3c6b2f122e" dependencies = [ "ahash", "arrow-buffer", @@ -287,9 +287,9 @@ dependencies = [ [[package]] name = "arrow-buffer" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fe9cd0064f2d7cf8ecfaf77cd70e67a980bc71aea92b63102bd37a7d3379a09" +checksum = "c7235b863533e9db3ab86905b4521251de11226275b436ff3cb2d0010558d1c5" dependencies = [ "bytes", "half", @@ -299,9 +299,9 @@ dependencies = [ [[package]] name = "arrow-cast" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee510bc252781d700400979a96bd1eadebeae23901132bbabd92118da1b376c5" +checksum = "d52cf840f0c34aeeb7e8b05aba72d66878e6c001827f423331f0b260209e7b7e" dependencies = [ "arrow-array", "arrow-buffer", @@ -319,11 +319,22 @@ dependencies = [ "ryu", ] +[[package]] +name = "arrow-cmp" +version = "60.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73a0e9adb28d95739fabcdae637261a2c14e618caf58ba1b88857120f9ee2687" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-schema", +] + [[package]] name = "arrow-csv" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace83d5935421b950fea3a0a3f9972c0837c297ef98ade57127a5661b681112c" +checksum = "2ad83176cc677f996096d694a3cccd7310069faeee4b3df9e2dabf92fdcf8b4b" dependencies = [ "arrow-array", "arrow-cast", @@ -336,9 +347,9 @@ dependencies = [ [[package]] name = "arrow-data" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54f128c73bb7fe9f7137218f910edd5b436f390e0f040b1956f5028390787897" +checksum = "5aa06d5e22786c4966ffc4d2f171d0cb65d95f6bdea108a14e8c335e9faa437f" dependencies = [ "arrow-buffer", "arrow-schema", @@ -349,9 +360,9 @@ dependencies = [ [[package]] name = "arrow-ipc" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e244f39b82fa7a823e8b5984a0bd988234f9c92c1df79378fb85090e6e4c821" +checksum = "86c523472d22e31f984df7a44fc36e6323d3c9b05ffe53d267ee4c3aa7c128d2" dependencies = [ "arrow-array", "arrow-buffer", @@ -360,14 +371,14 @@ dependencies = [ "arrow-select", "flatbuffers", "lz4_flex", - "zstd 0.13.3", + "zstd 0.14.3", ] [[package]] name = "arrow-json" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727b21ebf8894dcd9504d6ab66bffdac338391e1f85cde594526a0210299ea40" +checksum = "342fc6600a93a48038d853431803c941436b7b51f756763e76cad9784b7e3718" dependencies = [ "arrow-array", "arrow-buffer", @@ -390,12 +401,13 @@ dependencies = [ [[package]] name = "arrow-ord" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d376b9b883239ae0f9963cdeeb59126ccaac08d60adf208a6ad3e2dd4048c3" +checksum = "5a7ac2c6a9cdc782fa9548d3763461eaec8c93347e297fddbaa44807e70a3698" dependencies = [ "arrow-array", "arrow-buffer", + "arrow-cmp", "arrow-data", "arrow-schema", "arrow-select", @@ -403,9 +415,9 @@ dependencies = [ [[package]] name = "arrow-row" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48096811f92b5c3a0c59d33cfecd7d7d2ed037d81e54a27a42d232e7700e6de2" +checksum = "758b87e9648d80001e0916c083334ed93074c677a81a96144d5c84bd2d8eab2a" dependencies = [ "arrow-array", "arrow-buffer", @@ -416,9 +428,9 @@ dependencies = [ [[package]] name = "arrow-schema" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b6c8a6b12cf3869d299ce36ed8e1cd6fe9836264b68fb6c6538473a36124a1" +checksum = "f85a9a58cd03560526b0066487574aacb9008e413504fa0ee23d61141e96c338" dependencies = [ "bitflags 2.13.2", "serde_core", @@ -427,13 +439,14 @@ dependencies = [ [[package]] name = "arrow-select" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e523e85fa9fb3181a391bf0edfa6a1ae0dc46df8cbf7f6b96034dcb1e2a7a04a" +checksum = "ba3482b7d03bf4a3bf0b195f08a7f2b071595ccd54897e35b975ac63d3104977" dependencies = [ "ahash", "arrow-array", "arrow-buffer", + "arrow-cmp", "arrow-data", "arrow-schema", "num-traits", @@ -441,9 +454,9 @@ dependencies = [ [[package]] name = "arrow-string" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b931a905a0e4b8832d9f54fb369cf6e545f9dc03cb3d9611216a7bd2653df60a" +checksum = "f300b4400b1e7cd58f7cbbd5dd2a0072cc59e73bfaee2a152b3ac660e46d9dd1" dependencies = [ "arrow-array", "arrow-buffer", @@ -629,9 +642,9 @@ dependencies = [ [[package]] name = "atoi" -version = "2.0.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +checksum = "d12c37257553c19e9aee6cba77814fdc9e07844abfc8b3a2c377cd920ee5a993" dependencies = [ "num-traits", ] @@ -1121,11 +1134,11 @@ checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" [[package]] name = "blake2" -version = "0.10.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +checksum = "5b5d4d889834ee8ecfc0f8426ad30faf7cdcb10f741a8e6d7224d95325479f6f" dependencies = [ - "digest 0.10.7", + "digest 0.11.3", ] [[package]] @@ -1216,9 +1229,9 @@ dependencies = [ [[package]] name = "brotli" -version = "8.0.4" +version = "9.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" +checksum = "6737ce8b81460bf9407909f73ff50bf13f7cb8577e1e76715f57ed0eba58ba44" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1227,9 +1240,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "5.0.3" +version = "6.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +checksum = "34c6783f42c21c952ad7112b354f0ba2f10760e9decea5b1b60523d6e270faaf" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1502,9 +1515,9 @@ dependencies = [ [[package]] name = "comfy-table" -version = "7.2.2" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958c5d6ecf1f214b4c2bbbbf6ab9523a864bd136dcf71a7e8904799acfe1ad47" +checksum = "b96a46ad395a5e00676eddaca4a45ed78b29c08be5a878d35e4b071c625637dd" dependencies = [ "unicode-segmentation", "unicode-width", @@ -1878,9 +1891,8 @@ dependencies = [ [[package]] name = "datafusion" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd5317db77ba6bca25c761a8091b9d294a9f4188e4f9dcd0243e6a57de862ac" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-schema", @@ -1927,9 +1939,8 @@ dependencies = [ [[package]] name = "datafusion-catalog" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f35d36794509b7bfcbf90e11a1b5e4d047123c34610105e2e80a2048351cdb2f" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "async-trait", @@ -1952,9 +1963,8 @@ dependencies = [ [[package]] name = "datafusion-catalog-listing" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6454bfb7f43b83942e2ca2576fd09342eedbd0d323e1eef72c3c8e4d57d7203" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "async-trait", @@ -2164,9 +2174,8 @@ dependencies = [ [[package]] name = "datafusion-common" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26626e12b224b83351239465dcd00f72d47b02fb5e5b65a643e2dc8ed37f687" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-ipc", @@ -2191,9 +2200,8 @@ dependencies = [ [[package]] name = "datafusion-common-runtime" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a106420cbfa980f242c22243ae9a6cce661d4d86ce96cff87dacabf7754a4470" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "futures", "log", @@ -2202,9 +2210,8 @@ dependencies = [ [[package]] name = "datafusion-datasource" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "210aa1e9525e9454f2399dbb8b0b95510145bd8c1fdc35de74e9ccbf81bcb699" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "async-compression", @@ -2229,18 +2236,18 @@ dependencies = [ "log", "object_store", "parking_lot", + "pin-project-lite", "rand 0.9.5", "tokio", "tokio-util", "url", - "zstd 0.13.3", + "zstd 0.14.3", ] [[package]] name = "datafusion-datasource-arrow" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65b1b041688cad707fa103c3e7f4c6d89b3134ebf67da0129070dad3381851eb" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-ipc", @@ -2262,9 +2269,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-csv" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a7b34e253c4fa5251f174977af910a2f2ec831ec39dbbb56b29ce505cff278b" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "async-trait", @@ -2285,9 +2291,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-json" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1663338f43be6a5746473008e2d0fbde282577ddf0bae90d6c7386e988d71b29" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "async-trait", @@ -2308,9 +2313,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-parquet" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c521ae91b6d899d7190812881f45fe9463c222c11d90149f5332a2e56555904" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-schema", @@ -2340,15 +2344,13 @@ dependencies = [ [[package]] name = "datafusion-doc" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2569c2e74a34fcae3a369ab3912d61e41a062592510f11e31b1dae2725ecdc" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" [[package]] name = "datafusion-execution" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cfdd5ac0769d1e74a885450e49fde8f63ca7ab41eb479a068564aaea80b837" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-buffer", @@ -2373,9 +2375,8 @@ dependencies = [ [[package]] name = "datafusion-expr" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86560fd7df4dda924f5474b588c56e7ae8e96dcf158c7327c9cfe9daff448ec5" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-schema", @@ -2396,9 +2397,8 @@ dependencies = [ [[package]] name = "datafusion-expr-common" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e82e313cf655cf6bc2dce6cbd23bcb0d20236a54a1b09c436615e4bac4d8c49f" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "datafusion-common", @@ -2408,12 +2408,12 @@ dependencies = [ [[package]] name = "datafusion-functions" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "939ae2771da8a3fdc23ab4de610ae8fef9515476626b49d96d0d5c782b105771" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-buffer", + "arrow-select", "base64 0.23.1", "blake2", "blake3", @@ -2429,7 +2429,7 @@ dependencies = [ "hex", "itertools 0.15.0", "log", - "md-5 0.11.0", + "md-5", "memchr", "num-traits", "rand 0.9.5", @@ -2440,11 +2440,11 @@ dependencies = [ [[package]] name = "datafusion-functions-aggregate" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6c3aee9f2bc65716787d651e023743a90b4efbc57a2f679f036632e16fb110" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", + "arrow-select", "datafusion-common", "datafusion-doc", "datafusion-execution", @@ -2455,15 +2455,15 @@ dependencies = [ "datafusion-physical-expr-common", "half", "hashbrown 0.17.1", + "itertools 0.15.0", "log", "num-traits", ] [[package]] name = "datafusion-functions-aggregate-common" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "988b5d3dfb4939d81c2f9fab267063610fe52a843620f2fa6cb2a1598e43369c" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "datafusion-common", @@ -2473,9 +2473,8 @@ dependencies = [ [[package]] name = "datafusion-functions-nested" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08149d433a97c9ea3cdf80de06480ab5c7f5453485f1e452d5b3583c81d5c0dd" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-ord", @@ -2498,9 +2497,8 @@ dependencies = [ [[package]] name = "datafusion-functions-table" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c767567cce2782d4d0bdfa55fab010aaba0bdbe533509e9e0b9a6a3ee29ed59" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "async-trait", @@ -2514,9 +2512,8 @@ dependencies = [ [[package]] name = "datafusion-functions-window" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a311c1f558d1f792f1f631c3670da12ee72a20fbf5d6ca151325d66191c03c1" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "datafusion-common", @@ -2531,9 +2528,8 @@ dependencies = [ [[package]] name = "datafusion-functions-window-common" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffd54b8acf6ecef284cc0677e01e1b8c71be64fec50612ba00a0ff0d9b41a52" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "datafusion-common", "datafusion-physical-expr-common", @@ -2541,9 +2537,8 @@ dependencies = [ [[package]] name = "datafusion-macros" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d6df9763c8fb968b2417d797aef4c55ac2e4a895aaef38c72c16a287aa4a40" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "datafusion-doc", "quote", @@ -2552,9 +2547,8 @@ dependencies = [ [[package]] name = "datafusion-optimizer" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acfb8cea6e05e2e75bae183340cf7d53cccb3db0449e2f1fbc07654d980fd19f" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "chrono", @@ -2571,9 +2565,8 @@ dependencies = [ [[package]] name = "datafusion-physical-expr" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f002cef849e10c0597a217ec7891c2796c0f8b42d739f5d24abc24496373406" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-schema", @@ -2588,14 +2581,14 @@ dependencies = [ "itertools 0.15.0", "parking_lot", "petgraph", + "regex", "tokio", ] [[package]] name = "datafusion-physical-expr-adapter" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82761522c4536e7059d3b185cd99f10525c2bf48f1bd26a0a57e73e19eadc0fb" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "datafusion-common", @@ -2608,9 +2601,8 @@ dependencies = [ [[package]] name = "datafusion-physical-expr-common" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5c67aa252886f4d6b331c8114797f5b140464e774c4da36889269a1bf1bd8" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "chrono", @@ -2621,19 +2613,20 @@ dependencies = [ "itertools 0.15.0", "parking_lot", "pin-project", + "regex", ] [[package]] name = "datafusion-physical-optimizer" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a49dd3a76e4879012682c59dc3735282e60640c97483546a4113564a60bf8f" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "datafusion-common", "datafusion-execution", "datafusion-expr", "datafusion-expr-common", + "datafusion-functions-window", "datafusion-physical-expr", "datafusion-physical-expr-common", "datafusion-physical-plan", @@ -2644,9 +2637,8 @@ dependencies = [ [[package]] name = "datafusion-physical-plan" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1451d6817e5ac0dd21819b19949d1c420ab51d748f55dd9a96ecb5418a24c97" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "arrow-data", @@ -2659,6 +2651,7 @@ dependencies = [ "datafusion-common-runtime", "datafusion-execution", "datafusion-expr", + "datafusion-expr-common", "datafusion-functions", "datafusion-functions-aggregate-common", "datafusion-functions-window-common", @@ -2680,9 +2673,8 @@ dependencies = [ [[package]] name = "datafusion-pruning" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f11f0dbe2b5a642f6106e44de8bbd6654fa7220ca14f32313d4efd5514a86968" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "datafusion-common", @@ -2696,9 +2688,8 @@ dependencies = [ [[package]] name = "datafusion-session" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62dc5ce37a5ce1ff5362949776829aded2529a11dbaa13d24b0ffa6a059e106a" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow-schema", "async-trait", @@ -2706,16 +2697,17 @@ dependencies = [ "datafusion-execution", "datafusion-expr", "datafusion-physical-plan", + "futures", "parking_lot", ] [[package]] name = "datafusion-spark" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3d6f76463984c4ed8587c52ed4f21f142fd96fa55d8f128f673f2db4c46942" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", + "base64 0.23.1", "bigdecimal", "chrono", "crc32fast", @@ -2726,6 +2718,7 @@ dependencies = [ "datafusion-functions-aggregate", "datafusion-functions-aggregate-common", "datafusion-functions-nested", + "datafusion-physical-expr-common", "datafusion-session", "log", "num-traits", @@ -2740,9 +2733,8 @@ dependencies = [ [[package]] name = "datafusion-sql" -version = "55.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816c224a0ef5469a32a562b5d4830544f714f97c5f50142109286d40a288c7db" +version = "55.1.0" +source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" dependencies = [ "arrow", "bigdecimal", @@ -3567,7 +3559,7 @@ dependencies = [ [[package]] name = "iceberg" version = "0.10.1" -source = "git+https://github.com/apache/iceberg-rust?rev=1f3bc34058e3f3e45336bc5428f37b92649a608b#1f3bc34058e3f3e45336bc5428f37b92649a608b" +source = "git+https://github.com/andygrove/iceberg-rust?rev=8c8cf19e7078c2224f3de75e34c490b0f3d7c56d#8c8cf19e7078c2224f3de75e34c490b0f3d7c56d" dependencies = [ "aes-gcm", "anyhow", @@ -3625,7 +3617,7 @@ dependencies = [ [[package]] name = "iceberg-property-macro" version = "0.10.1" -source = "git+https://github.com/apache/iceberg-rust?rev=1f3bc34058e3f3e45336bc5428f37b92649a608b#1f3bc34058e3f3e45336bc5428f37b92649a608b" +source = "git+https://github.com/andygrove/iceberg-rust?rev=8c8cf19e7078c2224f3de75e34c490b0f3d7c56d#8c8cf19e7078c2224f3de75e34c490b0f3d7c56d" dependencies = [ "proc-macro2", "quote", @@ -3635,7 +3627,7 @@ dependencies = [ [[package]] name = "iceberg-storage-opendal" version = "0.10.1" -source = "git+https://github.com/apache/iceberg-rust?rev=1f3bc34058e3f3e45336bc5428f37b92649a608b#1f3bc34058e3f3e45336bc5428f37b92649a608b" +source = "git+https://github.com/andygrove/iceberg-rust?rev=8c8cf19e7078c2224f3de75e34c490b0f3d7c56d#8c8cf19e7078c2224f3de75e34c490b0f3d7c56d" dependencies = [ "anyhow", "async-trait", @@ -4240,16 +4232,6 @@ dependencies = [ "twox-hash", ] -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest 0.10.7", -] - [[package]] name = "md-5" version = "0.11.0" @@ -4260,16 +4242,6 @@ dependencies = [ "digest 0.11.3", ] -[[package]] -name = "mea" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c709842c4ce65cb91e2666ad5319dfc1efc3af0d34f02075eddca9000d9f8afb" -dependencies = [ - "hashbrown 0.17.1", - "slab", -] - [[package]] name = "memchr" version = "2.8.3" @@ -4373,6 +4345,18 @@ dependencies = [ "libc", ] +[[package]] +name = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +dependencies = [ + "bitflags 2.13.2", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "num" version = "0.4.3" @@ -4500,14 +4484,16 @@ dependencies = [ [[package]] name = "object_store" -version = "0.13.2" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622acbc9100d3c10e2ee15804b0caa40e55c933d5aa53814cd520805b7958a49" +checksum = "f1796bc93603f78c5760a69f2d58badc9618d22adade0a95385bb2adbae4eb94" dependencies = [ "async-trait", - "base64 0.22.1", + "aws-lc-rs", + "base64 0.23.1", "bytes", "chrono", + "crc-fast", "form_urlencoded", "futures-channel", "futures-core", @@ -4517,14 +4503,14 @@ dependencies = [ "httparse", "humantime", "hyper", - "itertools 0.14.0", - "md-5 0.10.6", + "itertools 0.15.0", + "md-5", + "nix 0.31.3", "parking_lot", "percent-encoding", - "quick-xml 0.39.4", + "quick-xml 0.41.0", "rand 0.10.3", - "reqwest 0.12.28", - "ring", + "reqwest 0.13.5", "rustls-pki-types", "serde", "serde_json", @@ -4536,19 +4522,20 @@ dependencies = [ "walkdir", "wasm-bindgen-futures", "web-time", + "windows-sys 0.61.2", ] [[package]] name = "object_store_opendal" -version = "0.58.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88f165780495c17aa3ce86846600504198c3fffd99073521552751c2430fa6ac" +checksum = "598e2f511e1d5b620f7bef985ec63a04c6d8c568402ff0d3969c5acf84ae1814" dependencies = [ "async-trait", + "asyncband 0.6.7", "bytes", "chrono", "futures", - "mea", "object_store", "opendal", "pin-project", @@ -4614,7 +4601,7 @@ dependencies = [ "http", "jiff", "log", - "md-5 0.11.0", + "md-5", "percent-encoding", "quick-xml 0.41.0", "reqsign-core", @@ -4792,7 +4779,7 @@ dependencies = [ "crc-fast", "http", "log", - "md-5 0.11.0", + "md-5", "opendal-core", "quick-xml 0.41.0", "reqsign-aws-v4", @@ -4897,9 +4884,9 @@ dependencies = [ [[package]] name = "parquet" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b3d2ef0fb136e9341570f219ecb168902e76079c6d81ad555f0a4840b1e08a3" +checksum = "8af83d2940bc0510f9aef86d865f56fdc6095f87ab115ac885a80b7c5226d3ba" dependencies = [ "ahash", "arrow-array", @@ -4923,54 +4910,51 @@ dependencies = [ "object_store", "parquet-variant", "parquet-variant-compute", - "parquet-variant-json", "ring", "seq-macro", "simdutf8", "snap", "tokio", "twox-hash", - "zstd 0.13.3", + "zstd 0.14.3", ] [[package]] name = "parquet-variant" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "587889e0dddd33f9eb536b20a489a20b2f556c4997ef1e09e49ae6df378d2ff0" +checksum = "ae8443f2224cbf220f0457a70ad8f41e62cbde25c2c0d0d7c6dfebdc389894b8" dependencies = [ - "arrow", "arrow-schema", "chrono", "half", "indexmap 2.14.2", - "num-traits", "simdutf8", "uuid", ] [[package]] name = "parquet-variant-compute" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea15140dcafc6d1b4c17f1a12fcb9590ec8b82095cbd70925a5a8aa4c905e04a" +checksum = "9cd02f2a545490a8d7c26f9f740627291e3c1b68272aa1f9bbb76e28d3ad5d61" dependencies = [ "arrow", "arrow-schema", "chrono", "half", "indexmap 2.14.2", + "num-traits", "parquet-variant", "parquet-variant-json", - "serde_json", "uuid", ] [[package]] name = "parquet-variant-json" -version = "59.3.1" +version = "60.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bf54eea151d1c8369a0b491fb727229149e4a09c9518e00aaaab1f816c25c8e" +checksum = "d83b1566b90235a000b3795081af4aa62843669e9a9e1a48cb9b63b23d48bfb3" dependencies = [ "arrow-schema", "base64 0.23.1", @@ -5235,7 +5219,7 @@ dependencies = [ "inferno", "libc", "log", - "nix", + "nix 0.26.4", "once_cell", "smallvec", "spin 0.10.1", @@ -5443,16 +5427,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "quick-xml" -version = "0.39.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "quick-xml" version = "0.41.0" @@ -5857,7 +5831,6 @@ dependencies = [ "base64 0.22.1", "bytes", "futures-core", - "futures-util", "h2", "http", "http-body", @@ -5879,14 +5852,12 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-rustls", - "tokio-util", "tower", "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", - "wasm-streams 0.4.2", "web-sys", ] @@ -5900,6 +5871,7 @@ dependencies = [ "bytes", "futures-core", "futures-util", + "h2", "http", "http-body", "http-body-util", @@ -5924,7 +5896,7 @@ dependencies = [ "url", "wasm-bindgen", "wasm-bindgen-futures", - "wasm-streams 0.5.0", + "wasm-streams", "web-sys", ] @@ -6513,9 +6485,9 @@ dependencies = [ [[package]] name = "sqlparser" -version = "0.62.0" +version = "0.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c6d1b651dc4edf07eead2a0c6c78016ce971bc2c10da5266861b13f25e7cec" +checksum = "3679862809bd1f92e563cf6fd820e28f39135303668001c10331d5027183e8b4" dependencies = [ "log", "sqlparser_derive", @@ -6523,13 +6495,13 @@ dependencies = [ [[package]] name = "sqlparser_derive" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6dd45d8fc1c79299bfbb7190e42ccbbdf6a5f52e4a6ad98d92357ea965bd289" +checksum = "2905ae8e8148d8f7f5748ea95d1e949fa4fc1d7f5161547b758ad118b2e4b0aa" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.9", ] [[package]] @@ -7244,19 +7216,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - [[package]] name = "wasm-streams" version = "0.5.0" diff --git a/native/Cargo.toml b/native/Cargo.toml index c858f9e715b..7286fbb1b7e 100644 --- a/native/Cargo.toml +++ b/native/Cargo.toml @@ -38,17 +38,19 @@ edition = "2021" rust-version = "1.95.0" [workspace.dependencies] -arrow = { version = "59.2.0", features = ["prettyprint", "ffi", "chrono-tz"] } -arrow-data = { version = "59.2.0" } -arrow-select = { version = "59.2.0" } +arrow = { version = "60.0.0", features = ["prettyprint", "ffi", "chrono-tz"] } +arrow-data = { version = "60.0.0" } +arrow-select = { version = "60.0.0" } async-trait = { version = "0.1" } bytes = { version = "1.11.1" } -parquet = { version = "59.2.0", default-features = false, features = ["experimental"] } -datafusion = { version = "55.2.0", default-features = false, features = ["unicode_expressions", "crypto_expressions", "nested_expressions", "parquet"] } -datafusion-datasource = { version = "55.2.0" } -datafusion-functions = { version = "55.2.0", default-features = false, features = ["datetime_expressions"] } -datafusion-physical-expr-adapter = { version = "55.2.0" } -datafusion-spark = { version = "55.2.0", features = ["core"] } +parquet = { version = "60.0.0", default-features = false, features = ["experimental"] } +# Tracking a DataFusion main revision ahead of its next release. The same revision is used +# by the `datafusion-functions-nested` dev-dependency in core and by the contrib crates. +datafusion = { git = "https://github.com/apache/datafusion", rev = "350ca76505c9513d16e7dd9910bcd9bde2c911ed", default-features = false, features = ["unicode_expressions", "crypto_expressions", "nested_expressions", "parquet"] } +datafusion-datasource = { git = "https://github.com/apache/datafusion", rev = "350ca76505c9513d16e7dd9910bcd9bde2c911ed" } +datafusion-functions = { git = "https://github.com/apache/datafusion", rev = "350ca76505c9513d16e7dd9910bcd9bde2c911ed", default-features = false, features = ["datetime_expressions"] } +datafusion-physical-expr-adapter = { git = "https://github.com/apache/datafusion", rev = "350ca76505c9513d16e7dd9910bcd9bde2c911ed" } +datafusion-spark = { git = "https://github.com/apache/datafusion", rev = "350ca76505c9513d16e7dd9910bcd9bde2c911ed", features = ["core"] } datafusion-comet-spark-expr = { path = "spark-expr" } datafusion-comet-common = { path = "common" } datafusion-comet-jni-bridge = { path = "jni-bridge" } @@ -75,7 +77,7 @@ rand = "0.10" # https://github.com/apache/datafusion-comet/issues/5813. regex = "1.12.3" thiserror = "2" -object_store = { version = "0.13.2", features = ["gcp", "azure", "aws", "http"] } +object_store = { version = "0.14.2", features = ["gcp", "azure", "aws", "http"] } url = "2.2" aws-config = "1.8.18" aws-credential-types = "1.2.13" @@ -84,9 +86,13 @@ aws-credential-types = "1.2.13" aws-sdk-sts = { version = "1.114.0", default-features = false } # Pinned to a revision rather than a release because no published iceberg-rust # version is on our arrow: 0.10.1 requires arrow/parquet ^58. Move to a plain -# version requirement once a release ships on arrow 59. Bump policy: #5645. -iceberg = { git = "https://github.com/apache/iceberg-rust", rev = "1f3bc34058e3f3e45336bc5428f37b92649a608b" } -iceberg-storage-opendal = { git = "https://github.com/apache/iceberg-rust", rev = "1f3bc34058e3f3e45336bc5428f37b92649a608b", features = ["opendal-memory", "opendal-fs", "opendal-s3", "opendal-gcs", "opendal-oss", "opendal-azdls"] } +# version requirement once a release ships on arrow 60. Bump policy: #5645. +# The revision is on the andygrove/iceberg-rust fork: apache/iceberg-rust#3257 (Arrow 60, +# not merged yet) with apache/iceberg-rust main at 1f3bc34 merged in, because that PR's +# head is 42 commits behind the main revision Comet builds against. Move back to an +# upstream main revision once #3257 merges. +iceberg = { git = "https://github.com/andygrove/iceberg-rust", rev = "8c8cf19e7078c2224f3de75e34c490b0f3d7c56d" } +iceberg-storage-opendal = { git = "https://github.com/andygrove/iceberg-rust", rev = "8c8cf19e7078c2224f3de75e34c490b0f3d7c56d", features = ["opendal-memory", "opendal-fs", "opendal-s3", "opendal-gcs", "opendal-oss", "opendal-azdls"] } reqsign-core = "3" [profile.release] diff --git a/native/comet-test-udfs/src/lib.rs b/native/comet-test-udfs/src/lib.rs index e3e1e9ca342..04707c379a6 100644 --- a/native/comet-test-udfs/src/lib.rs +++ b/native/comet-test-udfs/src/lib.rs @@ -30,8 +30,8 @@ //! - `make_ts_utc_c` / `make_ts_naive_c`: `(Int64) -> Timestamp`, built with //! and without a UTC tag, pinning which one Spark's `TimestampType` //! accepts -//! - `make_map_c`: `(Int64) -> Map`, built with arrow-rs's default -//! `MapBuilder` field names, which differ from the ones Comet emits +//! - `make_map_c`: `(Int64) -> Map`, built with `MapBuilder` field names +//! (`keys` / `values`) that differ from the ones Comet emits //! - `make_struct_c`: `(Int64) -> Struct`, whose field is declared //! non-nullable where Spark's `StructField` is nullable by default //! - `panics_on_invoke` / `panics_on_return_field`: panic containment @@ -44,8 +44,8 @@ use std::sync::Arc; use arrow::array::{ - Array, ArrayRef, Int32Array, Int32Builder, Int64Array, MapBuilder, StringArray, StringBuilder, - StructArray, TimestampMicrosecondArray, + Array, ArrayRef, Int32Array, Int32Builder, Int64Array, MapBuilder, MapFieldNames, StringArray, + StringBuilder, StructArray, TimestampMicrosecondArray, }; use arrow::datatypes::{DataType, Field, Fields, TimeUnit}; use arrow::util::display::{ArrayFormatter, FormatOptions}; @@ -299,18 +299,30 @@ fn micros(arg: &ArrayRef) -> Result { Ok(arr.iter().collect::()) } -/// `(Int64) -> Map(String, Int32)` built through arrow-rs's default -/// [`MapBuilder`]. +/// `(Int64) -> Map(String, Int32)` built through a [`MapBuilder`] with +/// explicit field names. /// -/// That builder names the map's children `entries` / `keys` / `values`, -/// where Comet's own Spark-to-Arrow conversion emits `entries` / `key` / -/// `value`. Those names are positional in the Arrow format, so the two -/// spellings have to be accepted interchangeably; this UDF is what proves -/// it end to end, since `echo_c` hands back the map Comet gave it and so -/// always carries Comet's own names. +/// The names are `entries` / `keys` / `values`, which is what arrow-rs's +/// default builder used before arrow 60 changed its default to `entries` / +/// `key` / `value`. Comet's own Spark-to-Arrow conversion emits the latter. +/// Those names are positional in the Arrow format, so the two spellings +/// have to be accepted interchangeably; this UDF is what proves it end to +/// end, since `echo_c` hands back the map Comet gave it and so always +/// carries Comet's own names. #[derive(Default)] pub struct MakeMapC; +impl MakeMapC { + fn builder() -> MapBuilder { + let names = MapFieldNames { + entry: "entries".to_string(), + key: "keys".to_string(), + value: "values".to_string(), + }; + MapBuilder::new(Some(names), StringBuilder::new(), Int32Builder::new()) + } +} + impl CometCScalarUdf for MakeMapC { fn name(&self) -> &str { "make_map_c" @@ -322,7 +334,7 @@ impl CometCScalarUdf for MakeMapC { } // Ask the builder itself for the type, so the declared type and the // built array cannot drift apart. - let mut builder = MapBuilder::new(None, StringBuilder::new(), Int32Builder::new()); + let mut builder = Self::builder(); builder.append(true).map_err(|e| e.to_string())?; Ok(Field::new( "make_map_c", @@ -336,7 +348,7 @@ impl CometCScalarUdf for MakeMapC { .as_any() .downcast_ref::() .ok_or_else(|| "expected Int64Array".to_string())?; - let mut builder = MapBuilder::new(None, StringBuilder::new(), Int32Builder::new()); + let mut builder = Self::builder(); for value in arr.iter() { match value { Some(v) => { diff --git a/native/core/Cargo.toml b/native/core/Cargo.toml index a01bbb7f829..1f398bd2265 100644 --- a/native/core/Cargo.toml +++ b/native/core/Cargo.toml @@ -85,7 +85,7 @@ comet-contrib-delta = { path = "../../contrib/delta/native", optional = true } # Optional Lance contrib. The native scan implementation lives outside core. comet-contrib-lance = { path = "../../contrib/lance/native", optional = true } reqwest = { version = "0.12", default-features = false, features = ["rustls-tls-native-roots", "http2"] } -object_store_opendal = { version = "0.58.0", optional = true } +object_store_opendal = { version = "0.59.0", optional = true } hdfs-sys = {version = "0.3.1", optional = true, features = ["hdfs_3_3"]} # Not optional: the location-scoped Iceberg storage recognizes opendal's permission errors, and # iceberg-storage-opendal builds the crate anyway. `hdfs-opendal` adds its HDFS service. @@ -116,7 +116,7 @@ jni = { workspace = true, features = ["invocation"] } lazy_static = "1.4" assertables = "10" hex = "0.4.3" -datafusion-functions-nested = { version = "55.2.0" } +datafusion-functions-nested = { git = "https://github.com/apache/datafusion", rev = "350ca76505c9513d16e7dd9910bcd9bde2c911ed" } comet-test-udfs = { path = "../comet-test-udfs" } # Test-only helpers for a hand-rolled in-memory HTTP client that exercises the web-identity STS # retry path without a socket, plus reqsign's SigV4 signer for the signing round-trip test. Already diff --git a/native/core/src/execution/delta_dv.rs b/native/core/src/execution/delta_dv.rs index a99409d2ed1..a4ff82347ca 100644 --- a/native/core/src/execution/delta_dv.rs +++ b/native/core/src/execution/delta_dv.rs @@ -463,9 +463,12 @@ fn reader_peak_bytes(selectors: usize, num_row_groups: usize) -> Result Result { - let Some(offset_index) = metadata.offset_index() else { + if !metadata + .page_index() + .is_some_and(|page_index| page_index.has_offset_indexes()) + { return Ok(0); - }; + } let overflow = || { GeneralError( "Deletion vector page-selection bound overflowed while summing offset-index page \ @@ -474,11 +477,14 @@ fn page_selection_bound_selectors(metadata: &ParquetMetaData) -> Result, - } - - unsafe extern "C" fn one_batch_get_schema( - stream: *mut FFI_ArrowArrayStream, - out: *mut FFI_ArrowSchema, - ) -> c_int { - let private = unsafe { &*((*stream).private_data as *const OneBatch) }; - match FFI_ArrowSchema::try_from(private.schema.as_ref()) { - Ok(schema) => { - unsafe { std::ptr::write(out, schema) }; - 0 - } - Err(_) => 22, // EINVAL - } - } - - unsafe extern "C" fn one_batch_get_next( - stream: *mut FFI_ArrowArrayStream, - out: *mut FFI_ArrowArray, - ) -> c_int { - let private = unsafe { &mut *((*stream).private_data as *mut OneBatch) }; - // A released (empty) array marks the end of the stream. - let array = match private.batch.take() { - Some(batch) => FFI_ArrowArray::new(&batch), - None => FFI_ArrowArray::empty(), - }; - unsafe { std::ptr::write(out, array) }; - 0 - } - - unsafe extern "C" fn one_batch_release(stream: *mut FFI_ArrowArrayStream) { - let stream = unsafe { &mut *stream }; - drop(unsafe { Box::from_raw(stream.private_data as *mut OneBatch) }); - stream.release = None; - } - - /// A C stream that yields `batch` once, with its buffers exactly as given. It stands in for a - /// JVM producer: arrow-rs's own `FFI_ArrowArrayStream::new` exports from typed arrays, and a - /// typed array cannot hold an under-aligned buffer. - fn one_batch_stream(schema: SchemaRef, batch: ArrayData) -> FFI_ArrowArrayStream { - let private = Box::new(OneBatch { - schema, - batch: Some(batch), - }); - FFI_ArrowArrayStream { - get_schema: Some(one_batch_get_schema), - get_next: Some(one_batch_get_next), - get_last_error: None, - release: Some(one_batch_release), - private_data: Box::into_raw(private) as *mut c_void, - } - } - - /// Comet counterpart to arrow-rs#10030's `test_decimal128_under_aligned_round_trip`, run - /// through the stock `ArrowArrayStreamReader` that `ScanExec` reads from. A JVM producer - /// (arrow-java's `NettyAllocationManager`) only guarantees the C Data Interface's recommended - /// 8-byte alignment, so it can hand us a `Decimal128` buffer that is not 16-byte aligned. - /// Since arrow 59, `from_ffi_and_data_type` realigns such buffers on import. Arrow 58 passed - /// them through untouched, so building the typed `Decimal128Array` panicked in - /// `ScalarBuffer::::from` (apache/arrow-rs#10028). This test guards against an arrow - /// downgrade bringing that back. + use arrow::datatypes::{DataType, Fields}; + use arrow::ffi::{from_ffi_and_data_type, FFI_ArrowArray}; + + /// Comet counterpart to arrow-rs#10030's `test_decimal128_under_aligned_round_trip`. A JVM + /// producer (arrow-java's `NettyAllocationManager`) only guarantees the C Data Interface's + /// recommended 8-byte alignment, so it can hand us a `Decimal128` buffer that is not 16-byte + /// aligned (apache/arrow-rs#10028). `ArrowArrayStreamReader`, which `ScanExec` reads from, + /// imports each batch with `from_ffi_and_data_type`, which realigns such buffers since arrow + /// 59. Arrow 58 passed them through untouched, so building the typed `Decimal128Array` + /// panicked in `ScalarBuffer::::from`. This test guards against an arrow downgrade + /// bringing that back. #[test] fn realigns_under_aligned_decimal128() { let decimal_type = DataType::Decimal128(10, 2); @@ -524,31 +467,27 @@ mod import_tests { .add_buffer(under_aligned) .build_unchecked() }; - - let schema: SchemaRef = Arc::new(Schema::new(vec![Field::new( - "d", - decimal_type.clone(), - false, - )])); + let fields = Fields::from(vec![Field::new("d", decimal_type, false)]); let struct_data = unsafe { - ArrayData::builder(DataType::Struct(schema.fields().clone())) + ArrayData::builder(DataType::Struct(fields.clone())) .len(2) .add_child_data(decimal) .build_unchecked() }; - - let stream = one_batch_stream(Arc::clone(&schema), struct_data); - let mut reader = ArrowArrayStreamReader::try_new(stream).unwrap(); - let batch = reader.next().unwrap().unwrap(); - let col = batch - .column(0) + let array = FFI_ArrowArray::new(&struct_data); + + // The same import `ArrowArrayStreamReader::next` performs. (Arrow 60 made the + // `FFI_ArrowArrayStream` callbacks private, so a hand-rolled stream is no longer possible.) + // SAFETY: `array` was exported above from data whose layout matches the struct type. + let data = unsafe { from_ffi_and_data_type(array, DataType::Struct(fields)) }.unwrap(); + let (_, columns, _) = StructArray::from(data).into_parts(); + let col = columns[0] .as_any() .downcast_ref::() .unwrap(); assert_eq!(col.len(), 2); assert_eq!(col.value(0), 1_i128 << 64); assert_eq!(col.value(1), 2_i128 << 64); - assert!(reader.next().is_none()); } #[test] diff --git a/native/core/src/execution/utils.rs b/native/core/src/execution/utils.rs index 527f276b25d..400b5b392b1 100644 --- a/native/core/src/execution/utils.rs +++ b/native/core/src/execution/utils.rs @@ -42,8 +42,10 @@ impl SparkArrowConvert for ArrayData { let ffi_array = FFI_ArrowArray::new(&data); // Spark owns the top-level name and nullability. Preserve the existing anonymous schema // shape while carrying logical extension metadata from the RecordBatch field. - let ffi_schema = - FFI_ArrowSchema::try_from(self.data_type())?.with_metadata(field.metadata())?; + let ffi_schema = FFI_ArrowSchema::try_from(self.data_type())?; + // SAFETY: `with_metadata` reinterprets the schema's private data, which is only sound for + // a schema arrow-rs produced itself. This one was just built by `TryFrom`. + let ffi_schema = unsafe { ffi_schema.with_metadata(field.metadata())? }; // Check if the pointer alignment is correct. if array_ptr.align_offset(array_align) != 0 || schema_ptr.align_offset(schema_align) != 0 { diff --git a/native/core/src/parquet/cast_column/variant/tests.rs b/native/core/src/parquet/cast_column/variant/tests.rs index fc5c6a1b11b..9ed80575033 100644 --- a/native/core/src/parquet/cast_column/variant/tests.rs +++ b/native/core/src/parquet/cast_column/variant/tests.rs @@ -202,7 +202,7 @@ fn normalize_fixed_size_list_and_reject_uuid() { let uuid: ArrayRef = Arc::new(FixedSizeBinaryArray::try_from_iter([[0_u8; 16]].into_iter()).unwrap()); let field = Field::new("typed_value", uuid.data_type().clone(), false) - .with_metadata([("ARROW:extension:name".to_string(), "arrow.uuid".to_string())].into()); + .with_metadata([("ARROW:extension:name".to_string(), "arrow.uuid".to_string())]); let error = normalize_variant_array(&wrap(field, uuid), &target_field(false)).unwrap_err(); assert!(error.to_string().contains("Parquet UUID")); } @@ -977,14 +977,32 @@ fn normalize_spark_empty_key_metadata_rejects_other_malformed_encodings() { ); for malformed in [ - vec![1, 3, 0, 1, 1, 2, 0xff, b'a'], // Invalid UTF-8. - vec![1, 3, 0, 2, 1, 2, b'z', b'a'], // Decreasing offsets. - vec![1, 3, 0, 1, 1, 2, b'z', b'z'], // Duplicate dictionary keys. - vec![1, 3, 0, 1, 1, 3, b'z', b'a'], // Out-of-bounds offset. - vec![1, 3, 0, 1, 1, 2, b'z', b'a', 0], // Unexpected trailing bytes. + vec![1, 3, 0, 1, 1, 2, 0xff, b'a'], // Invalid UTF-8. + vec![1, 3, 0, 2, 1, 2, b'z', b'a'], // Decreasing offsets. + vec![1, 3, 0, 1, 1, 3, b'z', b'a'], // Out-of-bounds offset. ] { assert!(normalize(&malformed).is_err(), "accepted {malformed:?}"); } + // Arrow 59 rejected both dictionaries only for their empty entry, which Arrow 60 accepts + // (apache/arrow-rs#10352), so they no longer reach the empty-key retry. Arrow does not reject + // the rest: an unsorted dictionary may repeat an entry, and bytes after the last offset are + // never read. The row passes through unchanged, as in Spark, which checks only the offsets + // of the keys it looks up. + for accepted in [ + vec![1, 3, 0, 1, 1, 2, b'z', b'z'], // Duplicate dictionary keys. + vec![1, 3, 0, 1, 1, 2, b'z', b'a', 0], // Trailing bytes. + ] { + let output = normalize(&accepted).unwrap(); + let output = output.as_struct(); + assert_eq!( + output.column(0).as_binary::().value(0), + value.as_slice() + ); + assert_eq!( + output.column(1).as_binary::().value(0), + accepted.as_slice() + ); + } } #[test] diff --git a/native/core/src/parquet/datetime_rebase.rs b/native/core/src/parquet/datetime_rebase.rs index 0dd405d27fc..33cca31aac1 100644 --- a/native/core/src/parquet/datetime_rebase.rs +++ b/native/core/src/parquet/datetime_rebase.rs @@ -80,7 +80,6 @@ //! Spark writer metadata; the plain NativeScan keeps its documented no-rebase behavior (see //! the compatibility guide and issue #5010). -use std::collections::HashMap; use std::fmt::{self, Display}; use std::hash::{Hash, Hasher}; use std::sync::Arc; @@ -90,8 +89,8 @@ use arrow::array::{ PrimitiveArray, RecordBatch, StructArray, }; use arrow::datatypes::{ - ArrowPrimitiveType, ArrowTimestampType, DataType, Date32Type, FieldRef, Int32Type, Schema, - SchemaRef, TimeUnit, TimestampMicrosecondType, TimestampMillisecondType, + ArrowPrimitiveType, ArrowTimestampType, DataType, Date32Type, FieldRef, Int32Type, Metadata, + Schema, SchemaRef, TimeUnit, TimestampMicrosecondType, TimestampMillisecondType, TimestampNanosecondType, TimestampSecondType, }; use arrow::error::ArrowError; @@ -394,8 +393,7 @@ pub(crate) fn stamp_int96_leaves(metadata: &ParquetMetaData) -> Option) -> WriterTimeZone { +fn writer_time_zone(metadata: &Metadata) -> WriterTimeZone { match metadata.get(SPARK_TIMEZONE_KEY) { Some(tz) if UTC_EQUIVALENT_TIMEZONES.contains(&tz.as_str()) => WriterTimeZone::Utc, _ => WriterTimeZone::OtherOrUnknown, @@ -736,7 +734,7 @@ fn writer_time_zone(metadata: &HashMap) -> WriterTimeZone { /// file's `org.apache.spark.timeZone` key, same lookup as the metadata-driven LEGACY path), /// and EXCEPTION refuses ancient values as [`RebasePolicy::CheckAncient`]. fn resolve_spec( - metadata: &HashMap, + metadata: &Metadata, min_version: &str, legacy_key: &str, conf_mode: RebaseReadMode, @@ -1284,6 +1282,7 @@ mod tests { use arrow::buffer::OffsetBuffer; use arrow::datatypes::Field; use parquet::schema::parser::parse_message_type; + use std::collections::HashMap; /// Julian-calendar civil date -> hybrid day count (the number a legacy writer stores for /// that nominal date), the inverse of `julian_day_to_civil`. Fliegel-Van Flandern style diff --git a/native/core/src/parquet/eager_page_index_reader_factory.rs b/native/core/src/parquet/eager_page_index_reader_factory.rs index 00220e26666..6b61f4211f5 100644 --- a/native/core/src/parquet/eager_page_index_reader_factory.rs +++ b/native/core/src/parquet/eager_page_index_reader_factory.rs @@ -523,8 +523,7 @@ fn with_spark_arrow_schema(metadata: Arc) -> ParquetResult) -> PartitionedFile { let mut field = arrow::datatypes::Field::new("a", DataType::Int32, false); if let Some(id) = id { - field = field - .with_metadata([(PARQUET_FIELD_ID_META_KEY.to_string(), id.to_string())].into()); + field = field.with_metadata([(PARQUET_FIELD_ID_META_KEY.to_string(), id.to_string())]); } let schema = Arc::new(Schema::new(vec![field])); let batch = RecordBatch::try_new( @@ -1739,7 +1739,7 @@ mod tests { fn variant_policy_preserves_footer_metadata_and_indexes() { let schema = Arc::new(Schema::new_with_metadata( vec![arrow::datatypes::Field::new("id", DataType::Int32, false)], - [("application".to_string(), "keep".to_string())].into(), + [("application".to_string(), "keep".to_string())], )); let batch = RecordBatch::try_new( Arc::clone(&schema), @@ -1765,10 +1765,9 @@ mod tests { .unwrap(); let original = Arc::new(reader.metadata().clone()); let rewritten = with_spark_arrow_schema(Arc::clone(&original)).unwrap(); - assert!(original.column_index().is_some()); - assert!(original.offset_index().is_some()); - assert_eq!(rewritten.column_index(), original.column_index()); - assert_eq!(rewritten.offset_index(), original.offset_index()); + let page_index = original.page_index().expect("original has a page index"); + assert!(page_index.is_complete()); + assert!(Arc::ptr_eq(rewritten.page_index().unwrap(), page_index)); assert_eq!(rewritten.row_groups(), original.row_groups()); assert_eq!( rewritten.file_metadata().column_orders(), @@ -1852,7 +1851,9 @@ mod tests { for file in &files { let metadata = open(&factory, file, &metrics).await.unwrap(); assert_eq!(metadata.file_metadata().num_rows(), 2); - assert!(metadata.column_index().is_some() && metadata.offset_index().is_some()); + assert!(metadata + .page_index() + .is_some_and(|page_index| page_index.is_complete())); } assert_eq!(metric(&metrics, "scan_io_metadata_cache_misses"), 3); diff --git a/native/core/src/parquet/parquet_exec.rs b/native/core/src/parquet/parquet_exec.rs index d8ffee1aa70..c654c0e3077 100644 --- a/native/core/src/parquet/parquet_exec.rs +++ b/native/core/src/parquet/parquet_exec.rs @@ -25,6 +25,7 @@ use crate::parquet::parquet_support::{ }; use crate::parquet::schema_adapter::SparkPhysicalExprAdapterFactory; use arrow::datatypes::{Field, FieldRef, Schema, SchemaRef}; +use datafusion::common::parquet_config::DFTimeUnit; use datafusion::common::tree_node::TreeNode; use datafusion::config::{ParquetOptions, TableParquetOptions}; use datafusion::datasource::listing::PartitionedFile; @@ -422,12 +423,13 @@ fn get_options( table_parquet_options.global.pruning = session_parquet_options.pruning; // Hardcoded for Spark compatibility, not session-overridable. - table_parquet_options.global.coerce_int96 = Some("us".to_string()); + table_parquet_options.global.coerce_int96 = Some(DFTimeUnit::Microsecond); // INT96 columns encode UTC-adjusted instants; attaching the UTC timezone // preserves that signal at the Arrow level so the schema adapter can // distinguish INT96-derived TimestampLTZ from a true TimestampNTZ source // and apply the pre-Spark-4 SPARK-36182 rejection (#4219). - table_parquet_options.global.coerce_int96_tz = Some("UTC".to_string()); + table_parquet_options.global.coerce_int96_tz = + Some("UTC".parse().expect("UTC is a valid time zone")); let mut spark_parquet_options = SparkParquetOptions::new(EvalMode::Legacy, session_timezone); spark_parquet_options.allow_cast_unsigned_ints = true; spark_parquet_options.case_sensitive = case_sensitive; @@ -1263,8 +1265,8 @@ mod tests { assert!(!global.pruning); // Spark-compat fields stay hardcoded regardless of the session. - assert_eq!(global.coerce_int96, Some("us".to_string())); - assert_eq!(global.coerce_int96_tz, Some("UTC".to_string())); + assert_eq!(global.coerce_int96, Some(DFTimeUnit::Microsecond)); + assert_eq!(global.coerce_int96_tz, Some("UTC".parse().unwrap())); } // Regression test for #3978: DataFusion's opener requests `PageIndexPolicy::Skip` on the @@ -1352,7 +1354,9 @@ mod tests { .expect("cached entry should hold Parquet metadata") .parquet_metadata(); assert!( - parquet_meta.column_index().is_some() && parquet_meta.offset_index().is_some(), + parquet_meta + .page_index() + .is_some_and(|page_index| page_index.is_complete()), "cached metadata must include the page index" ); } @@ -1455,8 +1459,7 @@ mod tests { .fetch_metadata() .await .unwrap(); - assert!(footer_metadata.column_index().is_none()); - assert!(footer_metadata.offset_index().is_none()); + assert!(footer_metadata.page_index().is_none()); metadata_cache.put( &partitioned_file.object_meta.location, CachedFileMetadataEntry::new( @@ -1473,8 +1476,9 @@ mod tests { .unwrap(); let metadata = reader.get_metadata(None).await.unwrap(); - assert!(metadata.column_index().is_some()); - assert!(metadata.offset_index().is_some()); + assert!(metadata + .page_index() + .is_some_and(|page_index| page_index.is_complete())); let metadata_bytes = reader_metric(&metrics, "scan_io_metadata_bytes"); assert!(metadata_bytes > 0); assert_eq!(reader_metric(&metrics, "scan_io_data_bytes"), 0); diff --git a/native/core/src/parquet/parquet_support.rs b/native/core/src/parquet/parquet_support.rs index 29d9c9d278b..9381a173c56 100644 --- a/native/core/src/parquet/parquet_support.rs +++ b/native/core/src/parquet/parquet_support.rs @@ -1155,7 +1155,7 @@ mod tests { object_store_backend(&url::Url::parse("memory:///a").unwrap(), false).unwrap(), ObjectStoreBackend::Other ); - // These spellings are not accepted native backends in pinned object_store 0.13.2. + // These spellings are not accepted native backends in pinned object_store 0.14.2. for scheme in ["gcs", "wasb", "wasbs", "s3n"] { let url = url::Url::parse(&format!("{scheme}://bucket/path")).unwrap(); assert!(object_store_backend(&url, false).is_err()); diff --git a/native/core/src/parquet/schema_adapter.rs b/native/core/src/parquet/schema_adapter.rs index 30f5ff79fd5..a3695ee559a 100644 --- a/native/core/src/parquet/schema_adapter.rs +++ b/native/core/src/parquet/schema_adapter.rs @@ -2868,8 +2868,9 @@ pub(crate) mod test { // INT96 coercion as `parquet_exec::get_options` hardcodes it for every native scan. let mut table_options = datafusion::config::TableParquetOptions::new(); - table_options.global.coerce_int96 = Some("us".to_string()); - table_options.global.coerce_int96_tz = Some("UTC".to_string()); + table_options.global.coerce_int96 = + Some(datafusion::common::parquet_config::DFTimeUnit::Microsecond); + table_options.global.coerce_int96_tz = Some("UTC".parse().unwrap()); let mut parquet_source = ParquetSource::new(required_schema) .with_table_parquet_options(table_options) .with_pushdown_filters(row_filters) diff --git a/native/operators/src/metric_owning.rs b/native/operators/src/metric_owning.rs index 32bb759697b..97088fe4cb1 100644 --- a/native/operators/src/metric_owning.rs +++ b/native/operators/src/metric_owning.rs @@ -219,6 +219,9 @@ impl ExecutionPlan for MetricOwningExec { Some(self.rebuild(inner, ExecutionPlanMetricsSet::new())) } + // DataFusion 56 deprecates `with_preserve_order` because it no longer calls it, but the + // method stays on the trait, so keep forwarding it to the wrapped operator. + #[allow(deprecated)] fn with_preserve_order(&self, preserve_order: bool) -> Option> { let inner = self.inner.with_preserve_order(preserve_order)?; let inner = inner.downcast_ref::()?.clone(); @@ -359,7 +362,9 @@ mod tests { rewrites.push(limited); } // The memory source does not support order-preserving rewrites for either operator. - assert!(owner.with_preserve_order(true).is_none()); + #[allow(deprecated)] + let preserved = owner.with_preserve_order(true); + assert!(preserved.is_none()); for rewritten in rewrites { assert!(rewritten.downcast_ref::>().is_some()); assert_eq!(rewritten.metrics().unwrap().iter().count(), 0); diff --git a/native/shuffle/src/ipc.rs b/native/shuffle/src/ipc.rs index 45974fc37ca..be572508a96 100644 --- a/native/shuffle/src/ipc.rs +++ b/native/shuffle/src/ipc.rs @@ -21,7 +21,7 @@ use crate::offsets_as_lengths::{ use arrow::array::{ArrayRef, RecordBatch}; use arrow::buffer::{Buffer, MutableBuffer}; use arrow::datatypes::{Schema, SchemaRef}; -use arrow::ipc::convert::fb_to_schema; +use arrow::ipc::convert::try_fb_to_schema; use arrow::ipc::reader::{read_dictionary_impl, RecordBatchDecoder}; use arrow::ipc::{root_as_message, Message, MessageHeader}; use arrow_data::UnsafeFlag; @@ -138,7 +138,7 @@ fn estimated_retained_size(schema_message: &[u8], schema: &Schema) -> usize { .saturating_add( schema .metadata() - .capacity() + .len() .saturating_mul(std::mem::size_of::<(String, String)>()), ); for (key, value) in schema.metadata() { @@ -300,7 +300,10 @@ fn read_single_batch<'b, S: BlockSource<'b>>( let schema = message .header_as_schema() .ok_or_else(|| decode_error("failed to parse schema from message header"))?; - let schema = Arc::new(fb_to_schema(schema)); + let schema = Arc::new( + try_fb_to_schema(schema) + .map_err(|error| decode_error(&format!("invalid schema: {error}")))?, + ); // A schema message has no body. Only bodiless ones are cached, so a hit never has a // body to skip; anything else is read past as StreamReader does, without caching. match body_length(&message)? { diff --git a/native/spark-expr/benches/list_extract.rs b/native/spark-expr/benches/list_extract.rs index 318a853f222..ecf75b19536 100644 --- a/native/spark-expr/benches/list_extract.rs +++ b/native/spark-expr/benches/list_extract.rs @@ -227,7 +227,7 @@ fn bench_nested(c: &mut Criterion) { for selected_len in [0, 1, 128] { let lengths = (0..ROWS).flat_map(|_| [selected_len, 128]); let offsets = OffsetBuffer::::from_lengths(lengths); - let count = *offsets.last().unwrap() as usize; + let count = offsets.last() as usize; let ints: ArrayRef = Arc::new(Int32Array::from_iter_values(0..count as i32)); let field = Arc::new(Field::new("item", DataType::Int32, true)); let lists = Arc::new(ListArray::new(field, offsets.clone(), ints.clone(), None)); @@ -312,7 +312,7 @@ fn bench_deep_nested(c: &mut Criterion) { let offsets = OffsetBuffer::from_lengths((0..ROWS).flat_map(|_| { std::iter::repeat_n(selected_len, WIDTH).chain(std::iter::repeat_n(16, WIDTH)) })); - let count = *offsets.last().unwrap(); + let count = offsets.last(); let inner: ArrayRef = Arc::new(ListArray::new( Arc::new(Field::new("item", DataType::Int32, true)), offsets, diff --git a/native/spark-expr/benches/map_extract.rs b/native/spark-expr/benches/map_extract.rs index c6b02f6af3e..d3cdc73e223 100644 --- a/native/spark-expr/benches/map_extract.rs +++ b/native/spark-expr/benches/map_extract.rs @@ -150,7 +150,7 @@ fn nested_map(selected_len: usize, null_percent: usize, shape: &str) -> MapArray let offsets = OffsetBuffer::::from_lengths((0..BATCH_SIZE).flat_map(|_| { std::iter::repeat_n(selected_len, width).chain(std::iter::repeat_n(128, width)) })); - let count = *offsets.last().unwrap(); + let count = offsets.last(); let lists: ArrayRef = Arc::new(ListArray::new( Arc::new(Field::new("item", DataType::Int32, true)), offsets, diff --git a/native/spark-expr/src/array_funcs/list_extract.rs b/native/spark-expr/src/array_funcs/list_extract.rs index 0700f218324..a255b22180c 100644 --- a/native/spark-expr/src/array_funcs/list_extract.rs +++ b/native/spark-expr/src/array_funcs/list_extract.rs @@ -474,7 +474,7 @@ mod test { let offsets = OffsetBuffer::from_lengths((0..ROWS).flat_map(|_| { std::iter::repeat_n(selected_len, WIDTH).chain(std::iter::repeat_n(16, WIDTH)) })); - let count = *offsets.last().unwrap(); + let count = offsets.last(); let inner: arrow::array::ArrayRef = Arc::new(ListArray::new( Arc::new(Field::new("item", DataType::Int32, true)), offsets, diff --git a/native/spark-expr/src/array_funcs/list_positions.rs b/native/spark-expr/src/array_funcs/list_positions.rs index 083f88a5230..552b1a351e2 100644 --- a/native/spark-expr/src/array_funcs/list_positions.rs +++ b/native/spark-expr/src/array_funcs/list_positions.rs @@ -104,8 +104,8 @@ impl PhysicalExpr for ListPositionsExpr { // original length. We build a fresh values array of length // `offsets.last() - offsets.first()`, so we must rebase offsets to zero to line them up. // See https://github.com/apache/datafusion-comet/issues/5224. - let base = offsets.first().copied().unwrap_or(0); - let total_len = (*offsets.last().unwrap() - base) as usize; + let base = offsets.first(); + let total_len = (offsets.last() - base) as usize; let mut values: Vec = Vec::with_capacity(total_len); for window in offsets.windows(2) { diff --git a/native/spark-expr/src/hash_funcs/xxhash64.rs b/native/spark-expr/src/hash_funcs/xxhash64.rs index 97db7fa7ff1..df5d01ca20e 100644 --- a/native/spark-expr/src/hash_funcs/xxhash64.rs +++ b/native/spark-expr/src/hash_funcs/xxhash64.rs @@ -44,9 +44,11 @@ const SPARK_DEFAULT_SEED: i64 = 42; /// Compatible arguments at the default seed are delegated to `datafusion-spark`'s /// `SparkXxhash64`. The Comet kernel is kept for: /// - a non-default seed (`SparkXxhash64` always starts from 42) -/// - `Struct` (and anything containing one): `SparkXxhash64` does not push a parent null -/// mask into children, so hidden values of a NULL struct would affect the hash -/// - a `Dictionary` nested in a list/map: `SparkXxhash64` restarts those hashes from 42 +/// - `Struct` (and anything containing one): before DataFusion 56, `SparkXxhash64` did not push +/// a parent null mask into children, so hidden values of a NULL struct would affect the hash +/// (fixed by apache/datafusion#25774) +/// - a `Dictionary` nested in a list/map: before DataFusion 56, `SparkXxhash64` restarted those +/// hashes from 42 (fixed by apache/datafusion#25813) /// - wide decimals: `SparkXxhash64` hashes fixed-width little-endian bytes instead /// of Spark's minimal signed big-endian representation /// - `Time64`, which `SparkXxhash64` does not dispatch diff --git a/native/spark-expr/src/hash_funcs/xxhash64_diff.rs b/native/spark-expr/src/hash_funcs/xxhash64_diff.rs index c427de88609..7244fb21a64 100644 --- a/native/spark-expr/src/hash_funcs/xxhash64_diff.rs +++ b/native/spark-expr/src/hash_funcs/xxhash64_diff.rs @@ -35,8 +35,8 @@ //! | Map<Utf8, Int32> / Map<Int32, Utf8> / Map<Utf8, Utf8> / Map<Int32, Int32> | yes | //! | Map<Utf8, Decimal128> | only for precision ≤ 18 | //! | Struct (non-null parent) | yes, but not routed (see below) | -//! | Struct NULL with hidden children | **no** — `SparkXxhash64` hashes hidden children | -//! | List<Dictionary> | **no** — upstream restarts from seed 42 | +//! | Struct NULL with hidden children | yes since DataFusion 56 (apache/datafusion#25774), but not routed | +//! | List<Dictionary> | yes since DataFusion 56 (apache/datafusion#25813), but not routed | //! | Time64(ns) | **no** — upstream does not dispatch | //! | Float32/64 NaN with non-canonical bits | **no** — upstream hashes the raw bits | //! | custom seed | **no** — `SparkXxhash64` hardcodes 42 | @@ -800,8 +800,10 @@ fn null_struct_ignores_hidden_child_values_comet() { ); } +/// `SparkXxhash64` used to hash the hidden child values of a NULL struct. DataFusion 56 fixed it +/// (apache/datafusion#25774), so upstream now agrees with the Comet kernel here. #[test] -fn null_struct_hidden_children_diverge_from_spark_xxhash64() { +fn null_struct_hidden_children_match_spark_xxhash64() { let fields: Fields = vec![Arc::new(Field::new("a", DataType::Int32, true))].into(); let nulls = NullBuffer::from(vec![true, false]); let hidden: ArrayRef = Arc::new(StructArray::new( @@ -813,9 +815,9 @@ fn null_struct_hidden_children_diverge_from_spark_xxhash64() { let upstream = spark_xxhash64_upstream(&[hidden]).unwrap(); assert_eq!(comet[0], upstream[0], "non-null struct row still matches"); assert_eq!(comet[1], SPARK_DEFAULT_SEED); - assert_ne!( + assert_eq!( comet[1], upstream[1], - "SparkXxhash64 hashes hidden child values of a NULL struct" + "SparkXxhash64 ignores hidden child values of a NULL struct" ); } @@ -1034,8 +1036,10 @@ fn struct_of_list() { assert_compatible("Struct>", &[array]); } +/// `SparkXxhash64` used to restart the hash of a nested dictionary from seed 42. DataFusion 56 +/// fixed it (apache/datafusion#25813), so upstream now agrees with the Comet kernel here. #[test] -fn list_of_dictionary_is_incompatible() { +fn list_of_dictionary_matches_spark_xxhash64() { let values: ArrayRef = Arc::new(Int32Array::from(vec![10, 20])); let keys = Int8Array::from(vec![0i8, 1]); let dict: ArrayRef = Arc::new(DictionaryArray::::try_new(keys, values).unwrap()); @@ -1056,9 +1060,9 @@ fn list_of_dictionary_is_incompatible() { ); let upstream = spark_xxhash64_upstream(&[as_list(dict)]).unwrap(); - assert_ne!( + assert_eq!( comet_dict, upstream, - "SparkXxhash64 restarts nested dictionary hashes from seed 42" + "SparkXxhash64 keeps the running hash for nested dictionaries" ); } @@ -1177,7 +1181,9 @@ fn null_struct_expression_matches_comet_kernel() { assert_eq!(expr, kernel); assert_eq!(expr[1], SPARK_DEFAULT_SEED); let upstream = spark_xxhash64_upstream(&[hidden]).unwrap(); - assert_ne!(expr[1], upstream[1]); + // Upstream used to hash the hidden children of a NULL struct; DataFusion 56 fixed it + // (apache/datafusion#25774). + assert_eq!(expr[1], upstream[1]); } #[test] diff --git a/native/spark-expr/src/map_funcs/map_sort.rs b/native/spark-expr/src/map_funcs/map_sort.rs index b07ae8bd37a..e15c0f1ec17 100644 --- a/native/spark-expr/src/map_funcs/map_sort.rs +++ b/native/spark-expr/src/map_funcs/map_sort.rs @@ -256,8 +256,8 @@ mod tests { let sliced = full.slice(1, 1); assert_eq!( - sliced.offsets().first().copied(), - Some(2), + sliced.offsets().first(), + 2, "slice must keep original offsets" ); diff --git a/native/spark-expr/src/nested_compaction.rs b/native/spark-expr/src/nested_compaction.rs index 06a3a150147..10019d6293e 100644 --- a/native/spark-expr/src/nested_compaction.rs +++ b/native/spark-expr/src/nested_compaction.rs @@ -177,7 +177,7 @@ pub(crate) mod test_util { pub(crate) fn skewed_nested_values(selected_len: usize) -> Vec { let lengths = || (0..ROWS).flat_map(|_| [selected_len, 128]); let offsets = OffsetBuffer::::from_lengths(lengths()); - let count = *offsets.last().unwrap(); + let count = offsets.last(); let ints: ArrayRef = Arc::new(Int32Array::from_iter_values(0..count)); let list_of = |item: DataType, values: ArrayRef, nulls: Option| -> ArrayRef { Arc::new(ListArray::new( @@ -238,9 +238,7 @@ pub(crate) mod test_util { let inner = ListArray::new( Arc::new(Field::new("item", DataType::Int32, true)), inner_offsets.clone(), - Arc::new(Int32Array::from_iter_values( - 0..*inner_offsets.last().unwrap(), - )), + Arc::new(Int32Array::from_iter_values(0..inner_offsets.last())), Some((0..2 * ROWS * WIDTH).map(|i| i % 13 != 0).collect()), ); let deep: ArrayRef = Arc::new(ListArray::new( From 62c6daedeccc147a3f8f454535a66b120760faa8 Mon Sep 17 00:00:00 2001 From: Andy Grove Date: Mon, 26 Oct 2026 08:28:24 -0600 Subject: [PATCH 2/9] docs: document the all-NaN Iceberg manifest bound known issue and ignore its test Parquet 60 writes NaN min/max statistics for a float or double column chunk holding only NaN, and iceberg-rust copies them into the manifest bounds, where iceberg-java records none. Ignore the parity test that catches it, list the issue under the Iceberg known issues and add it to the 1.3.0 upgrade guide. It is tracked in #7242. --- docs/source/user-guide/latest/iceberg.md | 6 ++++++ .../user-guide/latest/migration-guide.md | 19 +++++++++++++++++++ .../comet/CometIcebergWriteActionSuite.scala | 7 ++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/docs/source/user-guide/latest/iceberg.md b/docs/source/user-guide/latest/iceberg.md index fd333043013..fcd33100a12 100644 --- a/docs/source/user-guide/latest/iceberg.md +++ b/docs/source/user-guide/latest/iceberg.md @@ -822,6 +822,12 @@ The native Iceberg writer is disabled by default. With `spark.comet.write.iceber iceberg-java rejects the value. The native writer also trims or lowercases a few other settings that iceberg-java reads as written ([#7008](https://github.com/apache/datafusion-comet/issues/7008)). +- **All-NaN `float` and `double` columns.** When a data file holds a column chunk with only NaN + values, the native writer records NaN as that column's lower and upper bound in the manifest. + iceberg-java records no bound, and the Iceberg spec does not allow NaN as a bound. This comes + from the Parquet writer, which writes NaN statistics for such a chunk since Parquet 60, and from + iceberg-rust, which copies them into the bounds + ([#7242](https://github.com/apache/datafusion-comet/issues/7242)). The physical differences that every native data file has, and why they are safe, are listed in [Accepted divergences](#accepted-divergences). diff --git a/docs/source/user-guide/latest/migration-guide.md b/docs/source/user-guide/latest/migration-guide.md index 99b357d7cf4..858fbbf70a5 100644 --- a/docs/source/user-guide/latest/migration-guide.md +++ b/docs/source/user-guide/latest/migration-guide.md @@ -57,6 +57,25 @@ Treat setting one of these keys as a temporary measure. If you find you cannot s legacy behavior, please open an issue describing your use case so it can be considered before the key is removed. +## Upgrading to Comet 1.3.0 + +Comet `1.3.0` makes no behavior changes that need a `spark.comet.legacy.*` key. The known issue +below needs none either, but check whether it applies to your deployment. + +### Native Iceberg Writer Bounds for All-NaN Columns + +This applies only if you enable the native Iceberg writer with `spark.comet.write.iceberg.enabled`, +which is off by default. Comet `1.3.0` moves to Parquet 60, which writes NaN min and max statistics +for a `float` or `double` column chunk that holds only NaN values. Earlier versions wrote none. +The native writer copies those statistics into the data file's lower and upper bounds, so the +manifest records NaN as a bound where iceberg-java records none, and the Iceberg spec does not +allow NaN as a bound. Comet `1.2.0` and earlier do not write these bounds. + +The data and the NaN counts are unaffected, and no setting restores the previous bounds. Disable +`spark.comet.write.iceberg.enabled` to have iceberg-java write the files. The fix belongs in +iceberg-rust and is tracked in +[#7242](https://github.com/apache/datafusion-comet/issues/7242). + ## Upgrading to Comet 1.2.0 Comet `1.2.0` makes no behavior changes that need a `spark.comet.legacy.*` key. The changes below diff --git a/spark/src/test/scala/org/apache/comet/CometIcebergWriteActionSuite.scala b/spark/src/test/scala/org/apache/comet/CometIcebergWriteActionSuite.scala index 6f752267a63..0e40f338fa0 100644 --- a/spark/src/test/scala/org/apache/comet/CometIcebergWriteActionSuite.scala +++ b/spark/src/test/scala/org/apache/comet/CometIcebergWriteActionSuite.scala @@ -2050,7 +2050,12 @@ class CometIcebergWriteActionSuite // value is NaN. The native path must reproduce those decisions via the JVM-side metrics // rebuild, so write identical data through both paths and pin the aggregated per-column // manifest metrics against each other. - test("native acceleration: NaN float/double manifest metrics match the JVM writer") { + // + // Ignored while Comet is on Parquet 60: it writes NaN statistics for an all-NaN column chunk, + // and iceberg-rust copies them into the manifest bounds, where iceberg-java records none. + // Re-enable once iceberg-rust skips NaN bounds. + // https://github.com/apache/datafusion-comet/issues/7242 + ignore("native acceleration: NaN float/double manifest metrics match the JVM writer") { assumeNativeAcceleration() withIcebergCatalog { _ => Seq("nan_native", "nan_jvm").foreach { t => From 1ee9afef4afb50974e8f27fa085f75b14e2509d5 Mon Sep 17 00:00:00 2001 From: Andy Grove Date: Tue, 3 Nov 2026 14:56:46 -0700 Subject: [PATCH 3/9] deps: use DataFusion branch-56 (1635ed9) with Arrow/Parquet 60.1.0 Point the DataFusion dependencies at the head of apache/datafusion branch-56 (1635ed94742c1c060852bc34dc6ebb2302241c7b), cut for the 56.0.0 release. It is 116 commits past the previous main revision and moves arrow/parquet to 60.1.0. - Bump arrow, arrow-data, arrow-select and parquet to 60.1.0. - Bump parking_lot to 0.13, which DataFusion's LazyBatchGenerator API now uses. - Rename ArrowArrayStreamReader to RecordBatchStreamReader (deprecated alias). - Use FixedSizeListArray::value_offset_at instead of the deprecated value_offset. - Arrow 60.1.0 encodes the IPC frame in the RSS bounded-buffer test 2048 bytes smaller, so the test measures the frame size instead of hard-coding it. --- contrib/delta/native/Cargo.lock | 252 ++++++++------- contrib/delta/native/Cargo.toml | 2 +- contrib/lance/native/Cargo.toml | 2 +- native/Cargo.lock | 288 ++++++++++-------- native/Cargo.toml | 20 +- native/core/Cargo.toml | 4 +- native/core/src/execution/operators/scan.rs | 16 +- native/core/src/execution/planner.rs | 6 +- native/jni-bridge/src/arrow_array_stream.rs | 2 +- native/operators/Cargo.toml | 2 +- native/operators/src/explode.rs | 2 +- .../src/writers/rss/rss_partition_writer.rs | 23 +- .../arrow/CometNativeArrowSource.scala | 2 +- 13 files changed, 358 insertions(+), 263 deletions(-) diff --git a/contrib/delta/native/Cargo.lock b/contrib/delta/native/Cargo.lock index 4e4a1f10a5d..1d7b12fef30 100644 --- a/contrib/delta/native/Cargo.lock +++ b/contrib/delta/native/Cargo.lock @@ -63,9 +63,9 @@ checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "arrow" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234ce58e76c04e8162c2e4bc3fe53fa7c2418ef5fba7bb2838b8531b7d4fbf14" +checksum = "d965156f2220e94dcf676e04322b7b0b41c97e85cb3e1c365b8e56d0f70be999" dependencies = [ "arrow-arith", "arrow-array", @@ -84,9 +84,9 @@ dependencies = [ [[package]] name = "arrow-arith" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2303ebedb1071f4f72d71171e383859a9a285c94d99e4892685a96fca9890720" +checksum = "ca16fdd1daeb1eccefb42df52ec65448ef33eec72488598675d46dfa9ce58923" dependencies = [ "arrow-array", "arrow-buffer", @@ -98,9 +98,9 @@ dependencies = [ [[package]] name = "arrow-array" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51dff6e4b9f158864a0aeb6a131ad53858ecbae7a2fc8989307b9b3c6b2f122e" +checksum = "0f3d22a41d3df78b71df0b685af219ae3a94188ab98d6fb29c958eb55c3247f4" dependencies = [ "ahash", "arrow-buffer", @@ -117,9 +117,9 @@ dependencies = [ [[package]] name = "arrow-buffer" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7235b863533e9db3ab86905b4521251de11226275b436ff3cb2d0010558d1c5" +checksum = "7bd46a530bc1a8e763102fc36c1dc0f51f3ffa150c78e7f5658ccb54b1458ade" dependencies = [ "bytes", "half", @@ -129,9 +129,9 @@ dependencies = [ [[package]] name = "arrow-cast" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52cf840f0c34aeeb7e8b05aba72d66878e6c001827f423331f0b260209e7b7e" +checksum = "baa83a0752814a1922d5ee75032524ca9bbfb7f60ee35a67ed4ab8b275260aaf" dependencies = [ "arrow-array", "arrow-buffer", @@ -151,9 +151,9 @@ dependencies = [ [[package]] name = "arrow-cmp" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73a0e9adb28d95739fabcdae637261a2c14e618caf58ba1b88857120f9ee2687" +checksum = "1913e57a64fbf2c4502fa6d54b547d6a1ae59e3146cbc15321d47468c937abd1" dependencies = [ "arrow-array", "arrow-buffer", @@ -162,9 +162,9 @@ dependencies = [ [[package]] name = "arrow-csv" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad83176cc677f996096d694a3cccd7310069faeee4b3df9e2dabf92fdcf8b4b" +checksum = "e4572af05fadde76a063139805c089d0915b7eb64ed5bef14456c6e458a80b28" dependencies = [ "arrow-array", "arrow-cast", @@ -177,9 +177,9 @@ dependencies = [ [[package]] name = "arrow-data" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa06d5e22786c4966ffc4d2f171d0cb65d95f6bdea108a14e8c335e9faa437f" +checksum = "415b7fbc4cf56b080bb5677a4ae74211b5c79e571ed37a1d547633ec07f3b43b" dependencies = [ "arrow-buffer", "arrow-schema", @@ -190,9 +190,9 @@ dependencies = [ [[package]] name = "arrow-ipc" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86c523472d22e31f984df7a44fc36e6323d3c9b05ffe53d267ee4c3aa7c128d2" +checksum = "45f3e766bccf5a0cb57a5de52a4cba450dea5171547c2cb5939b486d08887cba" dependencies = [ "arrow-array", "arrow-buffer", @@ -206,9 +206,9 @@ dependencies = [ [[package]] name = "arrow-json" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "342fc6600a93a48038d853431803c941436b7b51f756763e76cad9784b7e3718" +checksum = "d843cca4b5361d7667564083b151a30d816d2b7e7ce2baa53948e2188f087f06" dependencies = [ "arrow-array", "arrow-buffer", @@ -231,9 +231,9 @@ dependencies = [ [[package]] name = "arrow-ord" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a7ac2c6a9cdc782fa9548d3763461eaec8c93347e297fddbaa44807e70a3698" +checksum = "4c58f2ae6dd1480fc413f7320a547e39dcc499c23d4f36ca19572b685811e6e4" dependencies = [ "arrow-array", "arrow-buffer", @@ -245,9 +245,9 @@ dependencies = [ [[package]] name = "arrow-row" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758b87e9648d80001e0916c083334ed93074c677a81a96144d5c84bd2d8eab2a" +checksum = "68f9db8345b0638416d3b56d117d262d13070fdef788c6d75b53a180215c477e" dependencies = [ "arrow-array", "arrow-buffer", @@ -258,9 +258,9 @@ dependencies = [ [[package]] name = "arrow-schema" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f85a9a58cd03560526b0066487574aacb9008e413504fa0ee23d61141e96c338" +checksum = "de2c8e714b466404cdc1189e89f892426efea614d938e16c15518c340cd43ba3" dependencies = [ "serde_core", "serde_json", @@ -268,9 +268,9 @@ dependencies = [ [[package]] name = "arrow-select" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3482b7d03bf4a3bf0b195f08a7f2b071595ccd54897e35b975ac63d3104977" +checksum = "a5af3f6656c5f2c6944f93d9a357a7f204c93d5f349385a44cf46c4a26fbcf30" dependencies = [ "ahash", "arrow-array", @@ -283,9 +283,9 @@ dependencies = [ [[package]] name = "arrow-string" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f300b4400b1e7cd58f7cbbd5dd2a0072cc59e73bfaee2a152b3ac660e46d9dd1" +checksum = "ab1be9306b9a413b5b004e2a5a19caac728870d76e8891b351f040d554c93862" dependencies = [ "arrow-array", "arrow-buffer", @@ -500,15 +500,15 @@ dependencies = [ "cfg-if", "crossbeam-utils", "hashbrown 0.14.5", - "lock_api", + "lock_api 0.4.14", "once_cell", - "parking_lot_core", + "parking_lot_core 0.9.12", ] [[package]] name = "datafusion" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-schema", @@ -542,7 +542,7 @@ dependencies = [ "itertools 0.15.0", "log", "object_store", - "parking_lot", + "parking_lot 0.13.0", "parquet", "tempfile", "tokio", @@ -552,8 +552,8 @@ dependencies = [ [[package]] name = "datafusion-catalog" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "async-trait", @@ -570,14 +570,14 @@ dependencies = [ "itertools 0.15.0", "log", "object_store", - "parking_lot", + "parking_lot 0.13.0", "tokio", ] [[package]] name = "datafusion-catalog-listing" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "async-trait", @@ -607,8 +607,8 @@ dependencies = [ [[package]] name = "datafusion-common" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-ipc", @@ -631,8 +631,8 @@ dependencies = [ [[package]] name = "datafusion-common-runtime" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "futures", "log", @@ -641,8 +641,8 @@ dependencies = [ [[package]] name = "datafusion-datasource" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "async-trait", @@ -662,7 +662,7 @@ dependencies = [ "itertools 0.15.0", "log", "object_store", - "parking_lot", + "parking_lot 0.13.0", "pin-project-lite", "rand", "tokio", @@ -671,8 +671,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-arrow" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-ipc", @@ -694,8 +694,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-csv" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "async-trait", @@ -716,8 +716,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-json" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "async-trait", @@ -738,8 +738,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-parquet" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-schema", @@ -762,20 +762,20 @@ dependencies = [ "itertools 0.15.0", "log", "object_store", - "parking_lot", + "parking_lot 0.13.0", "parquet", "tokio", ] [[package]] name = "datafusion-doc" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" [[package]] name = "datafusion-execution" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-buffer", @@ -788,7 +788,7 @@ dependencies = [ "futures", "log", "object_store", - "parking_lot", + "parking_lot 0.13.0", "pin-project-lite", "rand", "tempfile", @@ -799,8 +799,8 @@ dependencies = [ [[package]] name = "datafusion-expr" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-schema", @@ -820,8 +820,8 @@ dependencies = [ [[package]] name = "datafusion-expr-common" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "datafusion-common", @@ -831,8 +831,8 @@ dependencies = [ [[package]] name = "datafusion-functions" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-buffer", @@ -859,8 +859,8 @@ dependencies = [ [[package]] name = "datafusion-functions-aggregate" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-select", @@ -881,8 +881,8 @@ dependencies = [ [[package]] name = "datafusion-functions-aggregate-common" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "datafusion-common", @@ -892,8 +892,8 @@ dependencies = [ [[package]] name = "datafusion-functions-table" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "async-trait", @@ -902,13 +902,13 @@ dependencies = [ "datafusion-expr", "datafusion-physical-expr", "datafusion-physical-plan", - "parking_lot", + "parking_lot 0.13.0", ] [[package]] name = "datafusion-functions-window" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "datafusion-common", @@ -923,8 +923,8 @@ dependencies = [ [[package]] name = "datafusion-functions-window-common" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "datafusion-common", "datafusion-physical-expr-common", @@ -932,8 +932,8 @@ dependencies = [ [[package]] name = "datafusion-macros" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "datafusion-doc", "quote", @@ -942,8 +942,8 @@ dependencies = [ [[package]] name = "datafusion-optimizer" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "chrono", @@ -960,8 +960,8 @@ dependencies = [ [[package]] name = "datafusion-physical-expr" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-schema", @@ -974,7 +974,7 @@ dependencies = [ "hashbrown 0.17.1", "indexmap", "itertools 0.15.0", - "parking_lot", + "parking_lot 0.13.0", "petgraph", "regex", "tokio", @@ -982,8 +982,8 @@ dependencies = [ [[package]] name = "datafusion-physical-expr-adapter" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "datafusion-common", @@ -996,8 +996,8 @@ dependencies = [ [[package]] name = "datafusion-physical-expr-common" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "chrono", @@ -1006,15 +1006,15 @@ dependencies = [ "hashbrown 0.17.1", "indexmap", "itertools 0.15.0", - "parking_lot", + "parking_lot 0.13.0", "pin-project", "regex", ] [[package]] name = "datafusion-physical-optimizer" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "datafusion-common", @@ -1032,8 +1032,8 @@ dependencies = [ [[package]] name = "datafusion-physical-plan" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-data", @@ -1059,7 +1059,7 @@ dependencies = [ "itertools 0.15.0", "log", "num-traits", - "parking_lot", + "parking_lot 0.13.0", "pin-project-lite", "serde", "serde_json", @@ -1068,8 +1068,8 @@ dependencies = [ [[package]] name = "datafusion-pruning" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "datafusion-common", @@ -1083,8 +1083,8 @@ dependencies = [ [[package]] name = "datafusion-session" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow-schema", "async-trait", @@ -1093,7 +1093,7 @@ dependencies = [ "datafusion-expr", "datafusion-physical-plan", "futures", - "parking_lot", + "parking_lot 0.13.0", ] [[package]] @@ -1654,6 +1654,15 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "lock_api" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65d91b22da179613dcf4d6ec8349563f52a363f6849e03b00dd0a185ec4a59af" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.4.34" @@ -1747,7 +1756,7 @@ dependencies = [ "humantime", "itertools 0.15.0", "nix", - "parking_lot", + "parking_lot 0.12.5", "percent-encoding", "thiserror", "tokio", @@ -1771,8 +1780,18 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ - "lock_api", - "parking_lot_core", + "lock_api 0.4.14", + "parking_lot_core 0.9.12", +] + +[[package]] +name = "parking_lot" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9cf937ca4e1d0b7578784559063422fc39ae7c5a00f02471f2614d5486fd226" +dependencies = [ + "lock_api 0.5.0", + "parking_lot_core 0.10.0", ] [[package]] @@ -1783,16 +1802,28 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "parking_lot_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cfff060068cc18aa7815010fcaf80c68c7fb9e85fc7f5c0f9bf142c21d19826" +dependencies = [ + "libc", + "redox_syscall 0.9.5", "smallvec", "windows-link", ] [[package]] name = "parquet" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8af83d2940bc0510f9aef86d865f56fdc6095f87ab115ac885a80b7c5226d3ba" +checksum = "806eaa0f1c0436dcb43bee8e6a82bf2efff90521a60172f8281cb9ef577b43a4" dependencies = [ "ahash", "arrow-array", @@ -2037,6 +2068,15 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_syscall" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "580c875845b41ecb1564ad1ae4703044cef774145e3d7a94dc2b3fa7c97868fd" +dependencies = [ + "bitflags", +] + [[package]] name = "regex" version = "1.13.1" diff --git a/contrib/delta/native/Cargo.toml b/contrib/delta/native/Cargo.toml index e08f819c951..ca94f3d2c1d 100644 --- a/contrib/delta/native/Cargo.toml +++ b/contrib/delta/native/Cargo.toml @@ -47,4 +47,4 @@ crate-type = ["rlib"] datafusion-comet-proto = { path = "../../../native/proto" } # For `ExecutionPlan` (return type), `SchemaRef` (the shim hands these in), and `DataFusionError` # (the not-implemented error). Versions/features mirror core so the shared lockfile resolves cleanly. -datafusion = { git = "https://github.com/apache/datafusion", rev = "350ca76505c9513d16e7dd9910bcd9bde2c911ed", default-features = false, features = ["parquet"] } +datafusion = { git = "https://github.com/apache/datafusion", rev = "1635ed94742c1c060852bc34dc6ebb2302241c7b", default-features = false, features = ["parquet"] } diff --git a/contrib/lance/native/Cargo.toml b/contrib/lance/native/Cargo.toml index 7d032c13326..3072c870160 100644 --- a/contrib/lance/native/Cargo.toml +++ b/contrib/lance/native/Cargo.toml @@ -28,5 +28,5 @@ license = "Apache-2.0" crate-type = ["rlib"] [dependencies] -datafusion = { git = "https://github.com/apache/datafusion", rev = "350ca76505c9513d16e7dd9910bcd9bde2c911ed", default-features = false } +datafusion = { git = "https://github.com/apache/datafusion", rev = "1635ed94742c1c060852bc34dc6ebb2302241c7b", default-features = false } datafusion-comet-proto = { path = "../../../native/proto" } diff --git a/native/Cargo.lock b/native/Cargo.lock index 817ea8c43aa..80763e9db49 100644 --- a/native/Cargo.lock +++ b/native/Cargo.lock @@ -232,9 +232,9 @@ checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" [[package]] name = "arrow" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234ce58e76c04e8162c2e4bc3fe53fa7c2418ef5fba7bb2838b8531b7d4fbf14" +checksum = "d965156f2220e94dcf676e04322b7b0b41c97e85cb3e1c365b8e56d0f70be999" dependencies = [ "arrow-arith", "arrow-array", @@ -253,9 +253,9 @@ dependencies = [ [[package]] name = "arrow-arith" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2303ebedb1071f4f72d71171e383859a9a285c94d99e4892685a96fca9890720" +checksum = "ca16fdd1daeb1eccefb42df52ec65448ef33eec72488598675d46dfa9ce58923" dependencies = [ "arrow-array", "arrow-buffer", @@ -267,9 +267,9 @@ dependencies = [ [[package]] name = "arrow-array" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51dff6e4b9f158864a0aeb6a131ad53858ecbae7a2fc8989307b9b3c6b2f122e" +checksum = "0f3d22a41d3df78b71df0b685af219ae3a94188ab98d6fb29c958eb55c3247f4" dependencies = [ "ahash", "arrow-buffer", @@ -287,9 +287,9 @@ dependencies = [ [[package]] name = "arrow-buffer" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7235b863533e9db3ab86905b4521251de11226275b436ff3cb2d0010558d1c5" +checksum = "7bd46a530bc1a8e763102fc36c1dc0f51f3ffa150c78e7f5658ccb54b1458ade" dependencies = [ "bytes", "half", @@ -299,9 +299,9 @@ dependencies = [ [[package]] name = "arrow-cast" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52cf840f0c34aeeb7e8b05aba72d66878e6c001827f423331f0b260209e7b7e" +checksum = "baa83a0752814a1922d5ee75032524ca9bbfb7f60ee35a67ed4ab8b275260aaf" dependencies = [ "arrow-array", "arrow-buffer", @@ -321,9 +321,9 @@ dependencies = [ [[package]] name = "arrow-cmp" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73a0e9adb28d95739fabcdae637261a2c14e618caf58ba1b88857120f9ee2687" +checksum = "1913e57a64fbf2c4502fa6d54b547d6a1ae59e3146cbc15321d47468c937abd1" dependencies = [ "arrow-array", "arrow-buffer", @@ -332,9 +332,9 @@ dependencies = [ [[package]] name = "arrow-csv" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad83176cc677f996096d694a3cccd7310069faeee4b3df9e2dabf92fdcf8b4b" +checksum = "e4572af05fadde76a063139805c089d0915b7eb64ed5bef14456c6e458a80b28" dependencies = [ "arrow-array", "arrow-cast", @@ -347,9 +347,9 @@ dependencies = [ [[package]] name = "arrow-data" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa06d5e22786c4966ffc4d2f171d0cb65d95f6bdea108a14e8c335e9faa437f" +checksum = "415b7fbc4cf56b080bb5677a4ae74211b5c79e571ed37a1d547633ec07f3b43b" dependencies = [ "arrow-buffer", "arrow-schema", @@ -360,9 +360,9 @@ dependencies = [ [[package]] name = "arrow-ipc" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86c523472d22e31f984df7a44fc36e6323d3c9b05ffe53d267ee4c3aa7c128d2" +checksum = "45f3e766bccf5a0cb57a5de52a4cba450dea5171547c2cb5939b486d08887cba" dependencies = [ "arrow-array", "arrow-buffer", @@ -376,9 +376,9 @@ dependencies = [ [[package]] name = "arrow-json" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "342fc6600a93a48038d853431803c941436b7b51f756763e76cad9784b7e3718" +checksum = "d843cca4b5361d7667564083b151a30d816d2b7e7ce2baa53948e2188f087f06" dependencies = [ "arrow-array", "arrow-buffer", @@ -401,9 +401,9 @@ dependencies = [ [[package]] name = "arrow-ord" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a7ac2c6a9cdc782fa9548d3763461eaec8c93347e297fddbaa44807e70a3698" +checksum = "4c58f2ae6dd1480fc413f7320a547e39dcc499c23d4f36ca19572b685811e6e4" dependencies = [ "arrow-array", "arrow-buffer", @@ -415,9 +415,9 @@ dependencies = [ [[package]] name = "arrow-row" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758b87e9648d80001e0916c083334ed93074c677a81a96144d5c84bd2d8eab2a" +checksum = "68f9db8345b0638416d3b56d117d262d13070fdef788c6d75b53a180215c477e" dependencies = [ "arrow-array", "arrow-buffer", @@ -428,9 +428,9 @@ dependencies = [ [[package]] name = "arrow-schema" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f85a9a58cd03560526b0066487574aacb9008e413504fa0ee23d61141e96c338" +checksum = "de2c8e714b466404cdc1189e89f892426efea614d938e16c15518c340cd43ba3" dependencies = [ "bitflags 2.13.2", "serde_core", @@ -439,9 +439,9 @@ dependencies = [ [[package]] name = "arrow-select" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3482b7d03bf4a3bf0b195f08a7f2b071595ccd54897e35b975ac63d3104977" +checksum = "a5af3f6656c5f2c6944f93d9a357a7f204c93d5f349385a44cf46c4a26fbcf30" dependencies = [ "ahash", "arrow-array", @@ -454,9 +454,9 @@ dependencies = [ [[package]] name = "arrow-string" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f300b4400b1e7cd58f7cbbd5dd2a0072cc59e73bfaee2a152b3ac660e46d9dd1" +checksum = "ab1be9306b9a413b5b004e2a5a19caac728870d76e8891b351f040d554c93862" dependencies = [ "arrow-array", "arrow-buffer", @@ -1884,15 +1884,15 @@ dependencies = [ "cfg-if", "crossbeam-utils", "hashbrown 0.14.5", - "lock_api", + "lock_api 0.4.14", "once_cell", - "parking_lot_core", + "parking_lot_core 0.9.12", ] [[package]] name = "datafusion" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-schema", @@ -1928,7 +1928,7 @@ dependencies = [ "itertools 0.15.0", "log", "object_store", - "parking_lot", + "parking_lot 0.13.0", "parquet", "sqlparser", "tempfile", @@ -1939,8 +1939,8 @@ dependencies = [ [[package]] name = "datafusion-catalog" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "async-trait", @@ -1957,14 +1957,14 @@ dependencies = [ "itertools 0.15.0", "log", "object_store", - "parking_lot", + "parking_lot 0.13.0", "tokio", ] [[package]] name = "datafusion-catalog-listing" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "async-trait", @@ -2036,7 +2036,7 @@ dependencies = [ "object_store_opendal", "once_cell", "opendal", - "parking_lot", + "parking_lot 0.13.0", "parquet", "paste", "pprof", @@ -2100,7 +2100,7 @@ dependencies = [ "datafusion-comet-common", "datafusion-comet-spark-expr", "futures", - "parking_lot", + "parking_lot 0.13.0", "tokio", ] @@ -2174,8 +2174,8 @@ dependencies = [ [[package]] name = "datafusion-common" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-ipc", @@ -2200,8 +2200,8 @@ dependencies = [ [[package]] name = "datafusion-common-runtime" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "futures", "log", @@ -2210,8 +2210,8 @@ dependencies = [ [[package]] name = "datafusion-datasource" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "async-compression", @@ -2235,7 +2235,7 @@ dependencies = [ "liblzma", "log", "object_store", - "parking_lot", + "parking_lot 0.13.0", "pin-project-lite", "rand 0.9.5", "tokio", @@ -2246,8 +2246,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-arrow" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-ipc", @@ -2269,8 +2269,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-csv" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "async-trait", @@ -2291,8 +2291,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-json" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "async-trait", @@ -2313,8 +2313,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-parquet" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-schema", @@ -2337,20 +2337,20 @@ dependencies = [ "itertools 0.15.0", "log", "object_store", - "parking_lot", + "parking_lot 0.13.0", "parquet", "tokio", ] [[package]] name = "datafusion-doc" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" [[package]] name = "datafusion-execution" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-buffer", @@ -2363,7 +2363,7 @@ dependencies = [ "futures", "log", "object_store", - "parking_lot", + "parking_lot 0.13.0", "parquet", "pin-project-lite", "rand 0.9.5", @@ -2375,8 +2375,8 @@ dependencies = [ [[package]] name = "datafusion-expr" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-schema", @@ -2397,8 +2397,8 @@ dependencies = [ [[package]] name = "datafusion-expr-common" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "datafusion-common", @@ -2408,8 +2408,8 @@ dependencies = [ [[package]] name = "datafusion-functions" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-buffer", @@ -2440,8 +2440,8 @@ dependencies = [ [[package]] name = "datafusion-functions-aggregate" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-select", @@ -2462,8 +2462,8 @@ dependencies = [ [[package]] name = "datafusion-functions-aggregate-common" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "datafusion-common", @@ -2473,8 +2473,8 @@ dependencies = [ [[package]] name = "datafusion-functions-nested" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-ord", @@ -2497,8 +2497,8 @@ dependencies = [ [[package]] name = "datafusion-functions-table" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "async-trait", @@ -2507,13 +2507,13 @@ dependencies = [ "datafusion-expr", "datafusion-physical-expr", "datafusion-physical-plan", - "parking_lot", + "parking_lot 0.13.0", ] [[package]] name = "datafusion-functions-window" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "datafusion-common", @@ -2528,8 +2528,8 @@ dependencies = [ [[package]] name = "datafusion-functions-window-common" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "datafusion-common", "datafusion-physical-expr-common", @@ -2537,8 +2537,8 @@ dependencies = [ [[package]] name = "datafusion-macros" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "datafusion-doc", "quote", @@ -2547,8 +2547,8 @@ dependencies = [ [[package]] name = "datafusion-optimizer" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "chrono", @@ -2565,8 +2565,8 @@ dependencies = [ [[package]] name = "datafusion-physical-expr" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-schema", @@ -2579,7 +2579,7 @@ dependencies = [ "hashbrown 0.17.1", "indexmap 2.14.2", "itertools 0.15.0", - "parking_lot", + "parking_lot 0.13.0", "petgraph", "regex", "tokio", @@ -2587,8 +2587,8 @@ dependencies = [ [[package]] name = "datafusion-physical-expr-adapter" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "datafusion-common", @@ -2601,8 +2601,8 @@ dependencies = [ [[package]] name = "datafusion-physical-expr-common" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "chrono", @@ -2611,15 +2611,15 @@ dependencies = [ "hashbrown 0.17.1", "indexmap 2.14.2", "itertools 0.15.0", - "parking_lot", + "parking_lot 0.13.0", "pin-project", "regex", ] [[package]] name = "datafusion-physical-optimizer" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "datafusion-common", @@ -2637,8 +2637,8 @@ dependencies = [ [[package]] name = "datafusion-physical-plan" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "arrow-data", @@ -2664,7 +2664,7 @@ dependencies = [ "itertools 0.15.0", "log", "num-traits", - "parking_lot", + "parking_lot 0.13.0", "pin-project-lite", "serde", "serde_json", @@ -2673,8 +2673,8 @@ dependencies = [ [[package]] name = "datafusion-pruning" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "datafusion-common", @@ -2688,8 +2688,8 @@ dependencies = [ [[package]] name = "datafusion-session" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow-schema", "async-trait", @@ -2698,13 +2698,13 @@ dependencies = [ "datafusion-expr", "datafusion-physical-plan", "futures", - "parking_lot", + "parking_lot 0.13.0", ] [[package]] name = "datafusion-spark" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", "base64 0.23.1", @@ -2733,10 +2733,11 @@ dependencies = [ [[package]] name = "datafusion-sql" -version = "55.1.0" -source = "git+https://github.com/apache/datafusion?rev=350ca76505c9513d16e7dd9910bcd9bde2c911ed#350ca76505c9513d16e7dd9910bcd9bde2c911ed" +version = "56.0.0-dev" +source = "git+https://github.com/apache/datafusion?rev=1635ed94742c1c060852bc34dc6ebb2302241c7b#1635ed94742c1c060852bc34dc6ebb2302241c7b" dependencies = [ "arrow", + "arrow-schema", "bigdecimal", "chrono", "datafusion-common", @@ -4172,6 +4173,15 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "lock_api" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65d91b22da179613dcf4d6ec8349563f52a363f6849e03b00dd0a185ec4a59af" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.4.34" @@ -4204,7 +4214,7 @@ dependencies = [ "log", "log-mdc", "mock_instant", - "parking_lot", + "parking_lot 0.12.5", "rand 0.9.5", "serde", "serde-value", @@ -4315,7 +4325,7 @@ dependencies = [ "equivalent", "event-listener 5.4.2", "futures-util", - "parking_lot", + "parking_lot 0.12.5", "portable-atomic", "smallvec", "tagptr", @@ -4506,7 +4516,7 @@ dependencies = [ "itertools 0.15.0", "md-5", "nix 0.31.3", - "parking_lot", + "parking_lot 0.12.5", "percent-encoding", "quick-xml 0.41.0", "rand 0.10.3", @@ -4865,8 +4875,18 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ - "lock_api", - "parking_lot_core", + "lock_api 0.4.14", + "parking_lot_core 0.9.12", +] + +[[package]] +name = "parking_lot" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9cf937ca4e1d0b7578784559063422fc39ae7c5a00f02471f2614d5486fd226" +dependencies = [ + "lock_api 0.5.0", + "parking_lot_core 0.10.0", ] [[package]] @@ -4877,16 +4897,28 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[package]] +name = "parking_lot_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cfff060068cc18aa7815010fcaf80c68c7fb9e85fc7f5c0f9bf142c21d19826" +dependencies = [ + "libc", + "redox_syscall 0.9.5", "smallvec", "windows-link", ] [[package]] name = "parquet" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8af83d2940bc0510f9aef86d865f56fdc6095f87ab115ac885a80b7c5226d3ba" +checksum = "806eaa0f1c0436dcb43bee8e6a82bf2efff90521a60172f8281cb9ef577b43a4" dependencies = [ "ahash", "arrow-array", @@ -4921,9 +4953,9 @@ dependencies = [ [[package]] name = "parquet-variant" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8443f2224cbf220f0457a70ad8f41e62cbde25c2c0d0d7c6dfebdc389894b8" +checksum = "7cd190b833203e27e585c1f07e6ab1abbf353336688202ce036ecd8b7bc18259" dependencies = [ "arrow-schema", "chrono", @@ -4935,9 +4967,9 @@ dependencies = [ [[package]] name = "parquet-variant-compute" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cd02f2a545490a8d7c26f9f740627291e3c1b68272aa1f9bbb76e28d3ad5d61" +checksum = "ca43d38e0b3f91d177150fc72c86af888dcbd3c3d93888c2a2fbc95721200d89" dependencies = [ "arrow", "arrow-schema", @@ -4952,14 +4984,15 @@ dependencies = [ [[package]] name = "parquet-variant-json" -version = "60.0.0" +version = "60.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83b1566b90235a000b3795081af4aa62843669e9a9e1a48cb9b63b23d48bfb3" +checksum = "dadd517b64ce5b9a7160130f6ded8eed81a20ef8cec8e3e2458165f5195701ec" dependencies = [ "arrow-schema", "base64 0.23.1", "chrono", "parquet-variant", + "ryu", "serde_json", "uuid", ] @@ -5638,6 +5671,15 @@ dependencies = [ "bitflags 2.13.2", ] +[[package]] +name = "redox_syscall" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "580c875845b41ecb1564ad1ae4703044cef774145e3d7a94dc2b3fa7c97868fd" +dependencies = [ + "bitflags 2.13.2", +] + [[package]] name = "ref-cast" version = "1.0.27" @@ -6470,7 +6512,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "023a211cb3138dbc438680b32560ad89f699977624c9f8dbb95a47d5b4c07dd3" dependencies = [ - "lock_api", + "lock_api 0.4.14", ] [[package]] diff --git a/native/Cargo.toml b/native/Cargo.toml index 7286fbb1b7e..96f0501b51b 100644 --- a/native/Cargo.toml +++ b/native/Cargo.toml @@ -38,19 +38,19 @@ edition = "2021" rust-version = "1.95.0" [workspace.dependencies] -arrow = { version = "60.0.0", features = ["prettyprint", "ffi", "chrono-tz"] } -arrow-data = { version = "60.0.0" } -arrow-select = { version = "60.0.0" } +arrow = { version = "60.1.0", features = ["prettyprint", "ffi", "chrono-tz"] } +arrow-data = { version = "60.1.0" } +arrow-select = { version = "60.1.0" } async-trait = { version = "0.1" } bytes = { version = "1.11.1" } -parquet = { version = "60.0.0", default-features = false, features = ["experimental"] } -# Tracking a DataFusion main revision ahead of its next release. The same revision is used +parquet = { version = "60.1.0", default-features = false, features = ["experimental"] } +# Tracking the DataFusion branch-56 revision ahead of the 56.0.0 release. The same revision is used # by the `datafusion-functions-nested` dev-dependency in core and by the contrib crates. -datafusion = { git = "https://github.com/apache/datafusion", rev = "350ca76505c9513d16e7dd9910bcd9bde2c911ed", default-features = false, features = ["unicode_expressions", "crypto_expressions", "nested_expressions", "parquet"] } -datafusion-datasource = { git = "https://github.com/apache/datafusion", rev = "350ca76505c9513d16e7dd9910bcd9bde2c911ed" } -datafusion-functions = { git = "https://github.com/apache/datafusion", rev = "350ca76505c9513d16e7dd9910bcd9bde2c911ed", default-features = false, features = ["datetime_expressions"] } -datafusion-physical-expr-adapter = { git = "https://github.com/apache/datafusion", rev = "350ca76505c9513d16e7dd9910bcd9bde2c911ed" } -datafusion-spark = { git = "https://github.com/apache/datafusion", rev = "350ca76505c9513d16e7dd9910bcd9bde2c911ed", features = ["core"] } +datafusion = { git = "https://github.com/apache/datafusion", rev = "1635ed94742c1c060852bc34dc6ebb2302241c7b", default-features = false, features = ["unicode_expressions", "crypto_expressions", "nested_expressions", "parquet"] } +datafusion-datasource = { git = "https://github.com/apache/datafusion", rev = "1635ed94742c1c060852bc34dc6ebb2302241c7b" } +datafusion-functions = { git = "https://github.com/apache/datafusion", rev = "1635ed94742c1c060852bc34dc6ebb2302241c7b", default-features = false, features = ["datetime_expressions"] } +datafusion-physical-expr-adapter = { git = "https://github.com/apache/datafusion", rev = "1635ed94742c1c060852bc34dc6ebb2302241c7b" } +datafusion-spark = { git = "https://github.com/apache/datafusion", rev = "1635ed94742c1c060852bc34dc6ebb2302241c7b", features = ["core"] } datafusion-comet-spark-expr = { path = "spark-expr" } datafusion-comet-common = { path = "common" } datafusion-comet-jni-bridge = { path = "jni-bridge" } diff --git a/native/core/Cargo.toml b/native/core/Cargo.toml index 1f398bd2265..93a6d38845a 100644 --- a/native/core/Cargo.toml +++ b/native/core/Cargo.toml @@ -78,7 +78,7 @@ aws-credential-types = { workspace = true } aws-sdk-sts = { workspace = true } # Only for the `SharedHttpClient` type in `build_provider`'s test seam; already in the graph. aws-smithy-runtime-api = "1.16.0" -parking_lot = "0.12.5" +parking_lot = "0.13.0" # Optional Delta Lake contrib (enabled by the `contrib-delta` feature). Source lives # under `contrib/delta/native/` so non-Delta committers can ignore it. comet-contrib-delta = { path = "../../contrib/delta/native", optional = true } @@ -116,7 +116,7 @@ jni = { workspace = true, features = ["invocation"] } lazy_static = "1.4" assertables = "10" hex = "0.4.3" -datafusion-functions-nested = { git = "https://github.com/apache/datafusion", rev = "350ca76505c9513d16e7dd9910bcd9bde2c911ed" } +datafusion-functions-nested = { git = "https://github.com/apache/datafusion", rev = "1635ed94742c1c060852bc34dc6ebb2302241c7b" } comet-test-udfs = { path = "../comet-test-udfs" } # Test-only helpers for a hand-rolled in-memory HTTP client that exercises the web-identity STS # retry path without a socket, plus reqsign's SigV4 signer for the signing round-trip test. Already diff --git a/native/core/src/execution/operators/scan.rs b/native/core/src/execution/operators/scan.rs index 002512b3d76..fb0a39dad00 100644 --- a/native/core/src/execution/operators/scan.rs +++ b/native/core/src/execution/operators/scan.rs @@ -19,7 +19,7 @@ use crate::{errors::CometError, execution::planner::TEST_EXEC_CONTEXT_ID}; use arrow::array::{ArrayRef, RecordBatch, RecordBatchOptions}; use arrow::compute::{cast_with_options, CastOptions}; use arrow::datatypes::{DataType, Field, Schema, SchemaRef}; -use arrow::ffi_stream::ArrowArrayStreamReader; +use arrow::ffi_stream::RecordBatchStreamReader; use datafusion::common::tree_node::TreeNodeRecursion; use datafusion::common::{arrow_datafusion_err, DataFusionError, Result as DataFusionResult}; use datafusion::physical_plan::execution_plan::{Boundedness, EmissionType}; @@ -50,7 +50,7 @@ pub struct ScanExec { pub exec_context_id: i64, /// The C Stream Interface reader. `None` only in unit tests that seed input via /// `set_input_batch`. - pub input_source: Option>>, + pub input_source: Option>>, pub input_source_description: String, pub data_types: Vec, pub schema: SchemaRef, @@ -70,7 +70,7 @@ pub struct ScanExec { impl ScanExec { pub fn new( exec_context_id: i64, - input_source: Option>>, + input_source: Option>>, input_source_description: &str, data_types: Vec, ) -> Result { @@ -126,7 +126,7 @@ impl ScanExec { self.waker.wake(); } - /// Pulls the next input batch from the upstream `ArrowArrayStreamReader` unless one is + /// Pulls the next input batch from the upstream `RecordBatchStreamReader` unless one is /// already buffered, then wakes the stream waiting for it. pub fn get_next_batch(&mut self) -> Result<(), CometError> { if self.input_source.is_none() { @@ -153,7 +153,7 @@ impl ScanExec { /// Pull the next `RecordBatch` from the stream and convert it to an `InputBatch`. fn pull_next( exec_context_id: i64, - reader: &Arc>, + reader: &Arc>, ) -> Result { if exec_context_id == TEST_EXEC_CONTEXT_ID { // Unit test path; input batches are seeded directly. @@ -165,7 +165,7 @@ impl ScanExec { // `get_next_batch`, so a contended `try_lock` here would signal a caller bug, not races. let mut reader = reader .try_lock() - .map_err(|_| CometError::Internal("ArrowArrayStreamReader contended".to_string()))?; + .map_err(|_| CometError::Internal("RecordBatchStreamReader contended".to_string()))?; let next = reader.next(); match next { @@ -444,7 +444,7 @@ mod import_tests { /// Comet counterpart to arrow-rs#10030's `test_decimal128_under_aligned_round_trip`. A JVM /// producer (arrow-java's `NettyAllocationManager`) only guarantees the C Data Interface's /// recommended 8-byte alignment, so it can hand us a `Decimal128` buffer that is not 16-byte - /// aligned (apache/arrow-rs#10028). `ArrowArrayStreamReader`, which `ScanExec` reads from, + /// aligned (apache/arrow-rs#10028). `RecordBatchStreamReader`, which `ScanExec` reads from, /// imports each batch with `from_ffi_and_data_type`, which realigns such buffers since arrow /// 59. Arrow 58 passed them through untouched, so building the typed `Decimal128Array` /// panicked in `ScalarBuffer::::from`. This test guards against an arrow downgrade @@ -476,7 +476,7 @@ mod import_tests { }; let array = FFI_ArrowArray::new(&struct_data); - // The same import `ArrowArrayStreamReader::next` performs. (Arrow 60 made the + // The same import `RecordBatchStreamReader::next` performs. (Arrow 60 made the // `FFI_ArrowArrayStream` callbacks private, so a hand-rolled stream is no longer possible.) // SAFETY: `array` was exported above from data whose layout matches the struct type. let data = unsafe { from_ffi_and_data_type(array, DataType::Struct(fields)) }.unwrap(); diff --git a/native/core/src/execution/planner.rs b/native/core/src/execution/planner.rs index 3863637fb37..493f15a26b3 100644 --- a/native/core/src/execution/planner.rs +++ b/native/core/src/execution/planner.rs @@ -59,7 +59,7 @@ use arrow::compute::CastOptions; use arrow::datatypes::{ DataType, Field, FieldRef, Fields, IntervalUnit, Schema, TimeUnit, DECIMAL128_MAX_PRECISION, }; -use arrow::ffi_stream::{ArrowArrayStreamReader, FFI_ArrowArrayStream}; +use arrow::ffi_stream::{FFI_ArrowArrayStream, RecordBatchStreamReader}; use datafusion::{ arrow::{compute::SortOptions, datatypes::SchemaRef}, config::ConfigOptions, @@ -1907,7 +1907,7 @@ impl PhysicalPlanner { // Consumes the first input source for the scan. The Java side passes an // `org.apache.arrow.c.ArrowArrayStream` whose `memoryAddress` points at the C - // struct; native takes ownership via `ArrowArrayStreamReader::from_raw`. + // struct; native takes ownership via `RecordBatchStreamReader::from_raw`. let input_source = if self.exec_context_id == TEST_EXEC_CONTEXT_ID && inputs.is_empty() { @@ -1919,7 +1919,7 @@ impl PhysicalPlanner { jni_call!(env, arrow_array_stream(java_stream.as_obj()).memory_address() -> i64) })?; let reader = unsafe { - ArrowArrayStreamReader::from_raw(address as *mut FFI_ArrowArrayStream) + RecordBatchStreamReader::from_raw(address as *mut FFI_ArrowArrayStream) } .map_err(|e| { GeneralError(format!("Failed to import ArrowArrayStream from JVM: {e}")) diff --git a/native/jni-bridge/src/arrow_array_stream.rs b/native/jni-bridge/src/arrow_array_stream.rs index 0b285607ff5..322394d39d4 100644 --- a/native/jni-bridge/src/arrow_array_stream.rs +++ b/native/jni-bridge/src/arrow_array_stream.rs @@ -25,7 +25,7 @@ use jni::{ /// A struct that holds all the JNI methods and fields for JVM `org.apache.arrow.c.ArrowArrayStream` /// class. `memoryAddress()` is read once per partition so native can take ownership of the -/// underlying C struct via `ArrowArrayStreamReader::from_raw`. +/// underlying C struct via `RecordBatchStreamReader::from_raw`. #[allow(dead_code)] // we need to keep references to Java items to prevent GC pub struct ArrowArrayStream<'a> { pub class: JClass<'a>, diff --git a/native/operators/Cargo.toml b/native/operators/Cargo.toml index 07c7f61e0b9..e770838aa6a 100644 --- a/native/operators/Cargo.toml +++ b/native/operators/Cargo.toml @@ -34,7 +34,7 @@ datafusion = { workspace = true } datafusion-comet-common = { workspace = true } datafusion-comet-spark-expr = { workspace = true } futures = { workspace = true } -parking_lot = "0.12.5" +parking_lot = "0.13.0" [dev-dependencies] criterion = { version = "0.7", features = ["async", "async_tokio", "async_std"] } diff --git a/native/operators/src/explode.rs b/native/operators/src/explode.rs index 6aae0e2d349..427bdc80aef 100644 --- a/native/operators/src/explode.rs +++ b/native/operators/src/explode.rs @@ -1023,7 +1023,7 @@ impl ListArrayType for FixedSizeListArray { } fn value_offsets(&self, row: usize) -> (i64, i64) { - let start = self.value_offset(row) as i64; + let start = self.value_offset_at(row) as i64; (start, start + self.value_length() as i64) } diff --git a/native/shuffle/src/writers/rss/rss_partition_writer.rs b/native/shuffle/src/writers/rss/rss_partition_writer.rs index eb5774cc5fc..5b0086cdb30 100644 --- a/native/shuffle/src/writers/rss/rss_partition_writer.rs +++ b/native/shuffle/src/writers/rss/rss_partition_writer.rs @@ -1229,7 +1229,20 @@ mod buffer_tests { let block_writer = ShuffleBlockWriter::try_new(batch.schema().as_ref(), crate::CompressionCodec::None) .unwrap(); - let mut output = BoundedBuffer::try_new(67_996).unwrap(); + // Measure the frame unbounded first so the test doesn't pin Arrow's IPC encoding size. + let mut unbounded = Cursor::new(Vec::new()); + block_writer + .write_rss_batch( + &batch, + &mut unbounded, + &mut ShuffleCodecContext::default(), + &Time::default(), + ) + .unwrap(); + let frame_size = unbounded.get_ref().len(); + assert!(frame_size > 64 * 1024); + + let mut output = BoundedBuffer::try_new(frame_size).unwrap(); block_writer .write_rss_batch( &batch, @@ -1238,11 +1251,11 @@ mod buffer_tests { &Time::default(), ) .unwrap(); - assert_eq!(output.inner.get_ref().len(), 67_996); - assert_eq!(output.inner.get_ref().capacity(), 67_996); + assert_eq!(output.inner.get_ref().len(), frame_size); + assert_eq!(output.inner.get_ref().capacity(), frame_size); assert!(output.write(&[1]).is_err()); assert!(output.exceeded); - assert_eq!(output.minimum_size, 67_997); - assert_eq!(output.inner.get_ref().capacity(), 67_996); + assert_eq!(output.minimum_size, frame_size + 1); + assert_eq!(output.inner.get_ref().capacity(), frame_size); } } diff --git a/spark/src/main/scala/org/apache/spark/sql/comet/execution/arrow/CometNativeArrowSource.scala b/spark/src/main/scala/org/apache/spark/sql/comet/execution/arrow/CometNativeArrowSource.scala index 316afe68a22..98cd6715526 100644 --- a/spark/src/main/scala/org/apache/spark/sql/comet/execution/arrow/CometNativeArrowSource.scala +++ b/spark/src/main/scala/org/apache/spark/sql/comet/execution/arrow/CometNativeArrowSource.scala @@ -223,7 +223,7 @@ object CometArrowStream extends Logging { * task-completion cleanup. Returns a single-element iterator so this composes with * `RDD.mapPartitionsInternal`. * - * Close ordering: when native drops its `ArrowArrayStreamReader`, the C release callback fires + * Close ordering: when native drops its `RecordBatchStreamReader`, the C release callback fires * synchronously into `ExportedArrayStreamPrivateData.close` -> `reader.close` -> the VSR's * buffers are released. The task-completion listener registered here runs strictly after that * (Spark fires listeners in reverse registration order, and the listener that drops the native From 56a88c92d7e836ad50f770415b1b79ef38dd2f3d Mon Sep 17 00:00:00 2001 From: Andy Grove Date: Tue, 3 Nov 2026 15:47:03 -0700 Subject: [PATCH 4/9] fix: drop a needless borrow that clippy flags under Arrow 60 --- native/spark-expr/src/conversion_funcs/cast.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native/spark-expr/src/conversion_funcs/cast.rs b/native/spark-expr/src/conversion_funcs/cast.rs index 3cff045c5d4..049f4331352 100644 --- a/native/spark-expr/src/conversion_funcs/cast.rs +++ b/native/spark-expr/src/conversion_funcs/cast.rs @@ -957,7 +957,7 @@ fn cast_binary_to_string( nulls.clone() } else { // `sliced` shares the bitmap when the slice starts on a byte boundary. - let bits = Buffer::from_slice_ref(&nulls.inner().sliced()); + let bits = Buffer::from_slice_ref(nulls.inner().sliced()); NullBuffer::new(BooleanBuffer::new(bits, 0, nulls.len())) } }); From 96c7f075a3ef18602e8cfa6ab95d8e38b12003a2 Mon Sep 17 00:00:00 2001 From: Andy Grove Date: Tue, 3 Nov 2026 16:04:06 -0700 Subject: [PATCH 5/9] test: ignore the nested BINARY invalid UTF-8 tests on DataFusion 56 DataFusion 56 coerces nested BINARY file fields to Utf8 before the parquet reader, which skips UTF-8 validation for unannotated BINARY columns, so the native scan panics in debug builds instead of decoding to U+FFFD. Ignore the Rust and JVM tests from #7106 until apache/datafusion#27065 is fixed (#7469). --- native/core/src/parquet/parquet_exec.rs | 1 + .../scala/org/apache/comet/parquet/ParquetReadSuite.scala | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/native/core/src/parquet/parquet_exec.rs b/native/core/src/parquet/parquet_exec.rs index 950e19697fa..7f8aaf68f21 100644 --- a/native/core/src/parquet/parquet_exec.rs +++ b/native/core/src/parquet/parquet_exec.rs @@ -841,6 +841,7 @@ mod tests { /// Spark's string type as those types, not as `Binary`. A malformed value must still decode /// to U+FFFD. #[tokio::test] + #[ignore = "DataFusion 56 coerces nested BINARY to unvalidated Utf8: https://github.com/apache/datafusion-comet/issues/7469"] async fn nested_arrow_binary_types_read_as_string_decode_invalid_utf8() { use arrow::array::{Array, AsArray, BinaryArray, ListArray}; use arrow::buffer::OffsetBuffer; diff --git a/spark/src/test/scala/org/apache/comet/parquet/ParquetReadSuite.scala b/spark/src/test/scala/org/apache/comet/parquet/ParquetReadSuite.scala index 56743367a4a..d4bb07a86cb 100644 --- a/spark/src/test/scala/org/apache/comet/parquet/ParquetReadSuite.scala +++ b/spark/src/test/scala/org/apache/comet/parquet/ParquetReadSuite.scala @@ -147,7 +147,11 @@ abstract class ParquetReadSuite extends CometTestBase { } } - test("native scan decodes invalid UTF-8 in nested BINARY read as string") { + // Ignored while Comet is on DataFusion 56: its file-schema coercion reads nested BINARY as + // Utf8 without validating UTF-8, so the native scan panics in debug builds. + // Re-enable once https://github.com/apache/datafusion/issues/27065 is fixed. + // https://github.com/apache/datafusion-comet/issues/7469 + ignore("native scan decodes invalid UTF-8 in nested BINARY read as string") { withTempDir { dir => val path = new Path(dir.toURI.toString, "nested-binary.parquet") val parquetSchema = MessageTypeParser.parseMessageType("""message root { From 993beb81a06d4eeeccf729baeba05302539fb5f6 Mon Sep 17 00:00:00 2001 From: Andy Grove Date: Tue, 3 Nov 2026 16:12:08 -0700 Subject: [PATCH 6/9] refactor: install join and TopK dynamic filters without the deprecated setters DataFusion 56 deprecates HashJoinExec::with_dynamic_filter_expr and SortExec::with_dynamic_filter_expr with no replacement. Comet does not need them: - A SortExec with a fetch creates its own TopK filter, so the runtime TopK takes that filter from dynamic_expressions_produced() and hands it to the Parquet reader below the sort, instead of installing one from outside. - For joins, Comet reports to HashJoinExec::handle_child_pushdown_result what DataFusion's FilterPushdown rule would: the probe-side self filter was pushed down. The join then installs the filter itself after finding Comet's consumer in its probe subtree. --- .../operators/dynamic_filter/join.rs | 38 ++++++++++++--- .../operators/dynamic_filter/topk.rs | 46 ++++++++++++------- .../dynamic_filter/topk/tests/schema.rs | 2 +- 3 files changed, 63 insertions(+), 23 deletions(-) diff --git a/native/core/src/execution/operators/dynamic_filter/join.rs b/native/core/src/execution/operators/dynamic_filter/join.rs index 83552ce9e8b..f54748dfe8e 100644 --- a/native/core/src/execution/operators/dynamic_filter/join.rs +++ b/native/core/src/execution/operators/dynamic_filter/join.rs @@ -30,11 +30,14 @@ use std::sync::Arc; use arrow::datatypes::DataType; use datafusion::common::config::ConfigOptions; use datafusion::common::tree_node::TreeNodeRecursion; -use datafusion::common::{JoinType, NullEquality, Result, Statistics}; +use datafusion::common::{internal_datafusion_err, JoinType, NullEquality, Result, Statistics}; use datafusion::execution::TaskContext; use datafusion::physical_expr::expressions::{lit, Column, DynamicFilterPhysicalExpr}; use datafusion::physical_expr::PhysicalExpr; use datafusion::physical_plan::distribution_requirements::InputDistributionRequirements; +use datafusion::physical_plan::filter_pushdown::{ + ChildPushdownResult, FilterPushdownPhase, PushedDownPredicate, +}; use datafusion::physical_plan::joins::{HashJoinExec, PartitionMode}; use datafusion::physical_plan::metrics::{ExecutionPlanMetricsSet, MetricBuilder, MetricsSet}; use datafusion::physical_plan::statistics::{ChildStats, StatisticsArgs}; @@ -129,11 +132,7 @@ impl DynamicFilterJoinExec { .reset_state() .with_new_children(vec![Arc::clone(self.template.left()), consumer])? .build()?; - // DataFusion 56 deprecates this setter without a replacement. Upstream installs a join's - // dynamic filter only from `handle_child_pushdown_result`, which this runtime wiring - // bypasses. - #[allow(deprecated)] - let join = join.with_dynamic_filter_expr(predicate)?; + let join = install_probe_filter(&join, predicate, &self.config)?; Ok(RuntimeDynamicFilterJoin { join, reader_filter_attached, @@ -296,6 +295,33 @@ impl ExecutionPlan for DynamicFilterJoinExec { } } +/// Have `join` produce `predicate` for its probe side, which already holds the consumer. +/// +/// Comet does not run DataFusion's `FilterPushdown` rule, so this reports the result that rule +/// would: the join's probe-side self filter was pushed down. `HashJoinExec` then installs +/// `predicate` itself, after checking that a node in its probe subtree holds it. +fn install_probe_filter( + join: &HashJoinExec, + predicate: Arc, + config: &ConfigOptions, +) -> Result { + let pushdown = ChildPushdownResult { + parent_filters: vec![], + self_filters: vec![vec![], vec![PushedDownPredicate::supported(predicate)]], + }; + let updated = join + .handle_child_pushdown_result(FilterPushdownPhase::Post, pushdown, config)? + .updated_node + .ok_or_else(|| { + internal_datafusion_err!("HashJoinExec did not find its dynamic filter's consumer") + })?; + updated + .downcast_ref::() + .ok_or_else(|| internal_datafusion_err!("HashJoinExec pushdown returned another node"))? + .builder() + .build() +} + fn ineligible_reason(join: &HashJoinExec, config: &ConfigOptions) -> Result> { if !config.optimizer.enable_dynamic_filter_pushdown || !config.optimizer.enable_join_dynamic_filter_pushdown diff --git a/native/core/src/execution/operators/dynamic_filter/topk.rs b/native/core/src/execution/operators/dynamic_filter/topk.rs index dd4848b72d5..11d63ef1958 100644 --- a/native/core/src/execution/operators/dynamic_filter/topk.rs +++ b/native/core/src/execution/operators/dynamic_filter/topk.rs @@ -23,9 +23,9 @@ use std::sync::Arc; use arrow::datatypes::DataType; use datafusion::common::config::ConfigOptions; use datafusion::common::tree_node::TreeNodeRecursion; -use datafusion::common::{internal_err, Result, Statistics}; +use datafusion::common::{internal_datafusion_err, internal_err, Result, Statistics}; use datafusion::execution::TaskContext; -use datafusion::physical_expr::expressions::{lit, Column, DynamicFilterPhysicalExpr}; +use datafusion::physical_expr::expressions::{Column, DynamicFilterPhysicalExpr}; use datafusion::physical_expr::PhysicalExpr; use datafusion::physical_plan::distribution_requirements::InputDistributionRequirements; use datafusion::physical_plan::execution_plan::CardinalityEffect; @@ -95,21 +95,23 @@ impl TopKReaderFilterExec { } fn build_runtime_sort(&self) -> Result { - let predicate = Arc::new(DynamicFilterPhysicalExpr::new( - vec![Arc::clone(&self.template.expr()[0].expr)], - lit(true), - )); - let reader = try_attach_topk_reader_filter( - self.template.input(), - Arc::clone(&predicate), - &self.config, - )?; + // A fresh `SortExec` with a fetch creates its own TopK filter. Hand that filter to the + // Parquet reader below it rather than installing one from outside. + let sort = Self::fresh_sort(&self.template, Arc::clone(self.template.input())); + let predicate = produced_topk_filter(&sort)?; + let reader = try_attach_topk_reader_filter(self.template.input(), predicate, &self.config)?; let reader_filter_attached = reader.is_some(); - let input = reader.unwrap_or_else(|| Arc::clone(self.template.input())); - // DataFusion 56 deprecates this setter without a replacement; `SortExec` only restores its - // dynamic filter from a serialized plan, which this runtime wiring does not go through. - #[allow(deprecated)] - let sort = Self::fresh_sort(&self.template, input).with_dynamic_filter_expr(predicate)?; + let sort = match reader { + Some(reader) => Arc::new(sort) + .replace_children( + vec![reader], + ReplaceChildrenOptions::new(ChildrenPropertiesMode::Recompute), + )? + .downcast_ref::() + .ok_or_else(|| internal_datafusion_err!("SortExec rebuilt as another node"))? + .clone(), + None => sort, + }; Ok(RuntimeTopK { sort, reader_filter_attached, @@ -258,3 +260,15 @@ impl ExecutionPlan for TopKReaderFilterExec { #[cfg(test)] mod tests; + +/// The TopK dynamic filter `sort` produces. Comet's TopK path always has a fetch, so there is one. +fn produced_topk_filter(sort: &SortExec) -> Result> { + sort.dynamic_expressions_produced() + .into_iter() + .find_map(|expr| { + (expr as Arc) + .downcast::() + .ok() + }) + .ok_or_else(|| internal_datafusion_err!("SortExec with a fetch produced no TopK filter")) +} diff --git a/native/core/src/execution/operators/dynamic_filter/topk/tests/schema.rs b/native/core/src/execution/operators/dynamic_filter/topk/tests/schema.rs index 929b5ee7c4a..067610dcac5 100644 --- a/native/core/src/execution/operators/dynamic_filter/topk/tests/schema.rs +++ b/native/core/src/execution/operators/dynamic_filter/topk/tests/schema.rs @@ -17,7 +17,7 @@ use super::*; use datafusion::logical_expr::Operator; -use datafusion::physical_expr::expressions::BinaryExpr; +use datafusion::physical_expr::expressions::{lit, BinaryExpr}; fn write_file(payload_type: &DataType, start: i32) -> tempfile::NamedTempFile { let schema = Arc::new(Schema::new(vec![ From e0446662eaf76c75a2b9e7d82c9deb09a328c546 Mon Sep 17 00:00:00 2001 From: Andy Grove Date: Tue, 3 Nov 2026 16:13:54 -0700 Subject: [PATCH 7/9] fix: match the renamed ClusteredFinalAggregateStream consumer DataFusion 56 renames OrderedFinalAggregateStream to ClusteredFinalAggregateStream (apache/datafusion#24697), and the memory consumer with it. The fair pool's exemption for that consumer and the spill replay pool's final-aggregate check match it by name, so on DataFusion 56 neither matched anymore. Match the new name, and update the tests, docs and comments that use the old one. --- .../contributor-guide/memory_management.md | 4 ++-- .../src/execution/memory_pools/fair_pool.rs | 12 +++++------ .../execution/memory_pools/spill_replay.rs | 21 ++++++++++--------- .../core/src/execution/planner/aggregate.rs | 2 +- .../comet/exec/CometAggregateSuite.scala | 2 +- 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/docs/source/contributor-guide/memory_management.md b/docs/source/contributor-guide/memory_management.md index 4e7248f2ba3..448521207f3 100644 --- a/docs/source/contributor-guide/memory_management.md +++ b/docs/source/contributor-guide/memory_management.md @@ -394,8 +394,8 @@ A consumer that cannot spill takes what Spark grants. The pool refuses it only w total plus the request would exceed `pool_size`, which Spark's own limit on the task is at least as tight as unless the deprecated fraction is below `1 / N`. -The pool goes by what a consumer declares, with one exception. DataFusion 55.2 registers -`OrderedFinalAggregateStream` as able to spill even when its input is sorted on every grouping key, +The pool goes by what a consumer declares, with one exception. DataFusion registers +`ClusteredFinalAggregateStream` (`OrderedFinalAggregateStream` before DataFusion 56) as able to spill even when its input is sorted on every grouping key, as a workaround for [apache/datafusion#17334](https://github.com/apache/datafusion/issues/17334), but builds a spill path only for partially sorted input. Fully sorted, as in a `CometSortAggregateExec` over a native sort, a refusal fails the query, so the pool checks its requests only against the diff --git a/native/core/src/execution/memory_pools/fair_pool.rs b/native/core/src/execution/memory_pools/fair_pool.rs index 93174ba10e9..7664157907e 100644 --- a/native/core/src/execution/memory_pools/fair_pool.rs +++ b/native/core/src/execution/memory_pools/fair_pool.rs @@ -21,7 +21,7 @@ use std::{ }; use super::spark_memory::SparkMemory; -use super::spill_replay::ORDERED_FINAL_AGGREGATE; +use super::spill_replay::CLUSTERED_FINAL_AGGREGATE; use super::task_shared::RunningTasks; use datafusion::common::resources_err; use datafusion::execution::memory_pool::MemoryConsumer; @@ -157,13 +157,13 @@ impl Display for CometFairMemoryPool { /// Whether a request from `consumer` is held to its fair limit and the task's share. /// /// That is the case for every consumer that can spill, with one exception. DataFusion 55.2 -/// registers `OrderedFinalAggregateStream` as able to spill even when its input is sorted on every +/// registers `ClusteredFinalAggregateStream` as able to spill even when its input is sorted on every /// grouping key, to work around apache/datafusion#17334, but it builds a spill path only for /// partially sorted input. Fully sorted, as in a `CometSortAggregateExec` over a native sort, a /// refused request fails the query. So its requests are checked only against the pool, like those /// of a consumer that cannot spill. The partially sorted stream still spills when Spark refuses it. /// -/// The exemption goes by name, so it covers every `OrderedFinalAggregateStream`, including a +/// The exemption goes by name, so it covers every `ClusteredFinalAggregateStream`, including a /// pure `PartialMerge` that the planner runs as `Final` over input sorted on some of its keys /// (#6880). That one is not a `CometSortAggregateExec` and its input is only partially sorted, but /// it is checked only against the pool as well. The planner does not switch a `PartialMerge` over @@ -173,7 +173,7 @@ impl Display for CometFairMemoryPool { /// else, so it is one of `num_spill` and its bytes are not `unspillable`. A sort below it then /// stays limited to its fair share and leaves the aggregate the rest. fn limited_to_its_share(consumer: &MemoryConsumer) -> bool { - consumer.can_spill() && !consumer.name().starts_with(ORDERED_FINAL_AGGREGATE) + consumer.can_spill() && !consumer.name().starts_with(CLUSTERED_FINAL_AGGREGATE) } impl MemoryPool for CometFairMemoryPool { @@ -489,7 +489,7 @@ mod tests { let fake = FakeSpark::with(usize::MAX); let pool = pool(&fake, 100); let sort = spillable("ExternalSorter[0]", &pool); - let aggregate = spillable("OrderedFinalAggregateStream[0]", &pool); + let aggregate = spillable("ClusteredFinalAggregateStream[0]", &pool); // Not held to half of the task's 100 bytes, as a second consumer that can spill would be. aggregate.try_grow(60).unwrap(); @@ -505,7 +505,7 @@ mod tests { let fake = FakeSpark::with(usize::MAX); let pool = pool(&fake, 100); let sort = spillable("ExternalSorter[0]", &pool); - let aggregate = spillable("OrderedFinalAggregateStream[0]", &pool); + let aggregate = spillable("ClusteredFinalAggregateStream[0]", &pool); // The aggregate counts as a consumer that can spill, so the sort gets half. assert!(sort.try_grow(51).is_err()); diff --git a/native/core/src/execution/memory_pools/spill_replay.rs b/native/core/src/execution/memory_pools/spill_replay.rs index c4805ce1a98..dc3f9fabdd3 100644 --- a/native/core/src/execution/memory_pools/spill_replay.rs +++ b/native/core/src/execution/memory_pools/spill_replay.rs @@ -18,9 +18,9 @@ //! Lets a final aggregate read its spill files back past its share of memory (#6254). //! //! Once one of DataFusion 55's final aggregates has spilled, it merges its sorted spill files and -//! replays them through an `OrderedFinalAggregateStream` that has no way to spill, so a refused +//! replays them through an `ClusteredFinalAggregateStream` that has no way to spill, so a refused //! memory request there fails the task. `FinalHashAggregateStream` does this, and so does -//! `OrderedFinalAggregateStream` itself, which DataFusion uses when the input is sorted on some of +//! `ClusteredFinalAggregateStream` itself, which DataFusion uses when the input is sorted on some of //! the grouping keys, and which Comet also runs for a Spark PartialMerge over such input (#6880). //! So does `SingleHashAggregateStream`, which Comet runs for other Spark PartialMerges (#6857). //! The merge reserves read buffers for as many spill files as fit, and those buffers belong to the @@ -33,7 +33,7 @@ //! This relies on the following in DataFusion 55.1, which a DataFusion upgrade has to re-check: //! //! - The three aggregates name their consumers `FinalHashAggregateStream[{partition}]`, -//! `OrderedFinalAggregateStream[{partition}]` and `SingleHashAggregateStream[{partition}]`, and +//! `ClusteredFinalAggregateStream[{partition}]` and `SingleHashAggregateStream[{partition}]`, and //! their merge and replay reserve through sibling reservations of that consumer. //! - A final aggregate grows one reservation while another of its reservations holds memory only //! during the replay, while the merge holds its read buffers. Before that, the aggregate's table @@ -43,7 +43,7 @@ //! is for memory that already exists. //! - The replay emits every finished group after each batch, so it holds about one batch of groups, //! and releasing memory repays the overcommit first. -//! - `OrderedFinalAggregateStream` registers as able to spill even when its input is sorted on +//! - `ClusteredFinalAggregateStream` registers as able to spill even when its input is sorted on //! every grouping key, where it has no spill path, to work around apache/datafusion#17334. //! `CometFairMemoryPool` checks its requests only against the pool for that reason (see //! `limited_to_its_share` in `fair_pool.rs`). Drop that exception once #17334 is fixed and the @@ -181,15 +181,16 @@ pub(super) fn unwrap_spill_replay(pool: &Arc) -> Option<&Arc bool { let name = consumer.name(); name.starts_with("FinalHashAggregateStream[") - || name.starts_with(ORDERED_FINAL_AGGREGATE) + || name.starts_with(CLUSTERED_FINAL_AGGREGATE) || name.starts_with("SingleHashAggregateStream[") } @@ -372,7 +373,7 @@ mod tests { fn only_final_aggregates_replay_their_spill_files() { for name in [ "FinalHashAggregateStream[3]", - "OrderedFinalAggregateStream[0]", + "ClusteredFinalAggregateStream[0]", "SingleHashAggregateStream[0]", ] { assert!(is_final_aggregate(&MemoryConsumer::new(name)), "{name}"); @@ -380,7 +381,7 @@ mod tests { // Partial aggregates emit early instead of spilling. for name in [ "PartialHashAggregateStream[0]", - "OrderedPartialAggregateStream[0]", + "ClusteredPartialAggregateStream[0]", "ExternalSorterMerge[0]", ] { assert!(!is_final_aggregate(&MemoryConsumer::new(name)), "{name}"); diff --git a/native/core/src/execution/planner/aggregate.rs b/native/core/src/execution/planner/aggregate.rs index 03dc75e35d2..ff1c32f6a71 100644 --- a/native/core/src/execution/planner/aggregate.rs +++ b/native/core/src/execution/planner/aggregate.rs @@ -249,7 +249,7 @@ impl OperatorBuilder for HashAggBuilder { // DataFusion 55 runs Single over input sorted on some of its keys with the legacy // GroupedHashAggregateStream, whose spill can fail against the fair limit (#6880). Final - // runs an OrderedFinalAggregateStream there, which spills, and which the fair pool exempts + // runs a ClusteredFinalAggregateStream there, which spills, and which the fair pool exempts // from that limit (`limited_to_its_share`). MergeAsPartial evaluates to its state under // Final as under Single. // Only partially sorted input switches: with fully sorted input Final has no spill path diff --git a/spark/src/test/scala/org/apache/comet/exec/CometAggregateSuite.scala b/spark/src/test/scala/org/apache/comet/exec/CometAggregateSuite.scala index 2b9156346c5..1c6918d13f3 100644 --- a/spark/src/test/scala/org/apache/comet/exec/CometAggregateSuite.scala +++ b/spark/src/test/scala/org/apache/comet/exec/CometAggregateSuite.scala @@ -209,7 +209,7 @@ class CometAggregateSuite extends CometTestBase with AdaptiveSparkPlanHelper { .write .parquet(path) // Sorting on g, the first grouping key, makes DataFusion run the final aggregate as an - // OrderedFinalAggregateStream, which spills and reads its spill files back the same way. + // ClusteredFinalAggregateStream, which spills and reads its spill files back the same way. // Spark drops a sort under an aggregate unless EliminateSorts is excluded. With a 2.5 MiB // pool, merging the runs takes nearly all of the aggregate's share. The sort's merge // reservation is lowered so that the sort fits in the pool too. From b4649974011f115bdd2682f244ddf3065ebf7de5 Mon Sep 17 00:00:00 2001 From: Andy Grove Date: Tue, 3 Nov 2026 18:46:57 -0700 Subject: [PATCH 8/9] fix: remove the spill replay pool now that DataFusion 56 has #25383 DataFusion 56 includes apache/datafusion#25383, which leaves room for a final aggregate to read its spill files back, so SpillReplayPool is no longer needed. It is also now harmful: #25383 holds replay headroom on a sibling reservation while the spill merge picks its files, so the pool took every refused read-buffer request for a replay and granted it. The merge then opened every spill file and starved the next aggregate, which failed the #6880 PartialMerge test with a 2 MiB pool. The #6254 and #6857 read-back tests, which the pool was added for, pass without it. The sort-merge join #6880 test now uses an 8 MiB pool, because with DataFusion 56 its PartialMerge fits in 12 MiB or more without spilling. Closes #6583. --- .../contributor-guide/memory_management.md | 21 +- .../src/execution/memory_pools/fair_pool.rs | 7 +- native/core/src/execution/memory_pools/mod.rs | 21 +- .../execution/memory_pools/spill_replay.rs | 390 ------------------ .../core/src/execution/planner/aggregate.rs | 2 +- .../comet/exec/CometAggregateSuite.scala | 5 +- 6 files changed, 18 insertions(+), 428 deletions(-) delete mode 100644 native/core/src/execution/memory_pools/spill_replay.rs diff --git a/docs/source/contributor-guide/memory_management.md b/docs/source/contributor-guide/memory_management.md index 448521207f3..e729a83e87a 100644 --- a/docs/source/contributor-guide/memory_management.md +++ b/docs/source/contributor-guide/memory_management.md @@ -300,15 +300,12 @@ the inside out, a Comet plan in the default configuration sees: ```text [LoggingMemoryPool] <- only when spark.comet.debug.memory=true [TaskSharedMemoryPool] <- RAII handle for the per-task registry - [SpillReplayPool] <- lets a spilled final aggregate read its spill files back - [TrackConsumersPool] <- DataFusion; names the top 10 consumers in error messages - [CometFairMemoryPool] <- delegates acquire/release to Spark over JNI + [TrackConsumersPool] <- DataFusion; names the top 10 consumers in error messages + [CometFairMemoryPool] <- delegates acquire/release to Spark over JNI ``` Each decorator forwards every `MemoryPool` method to its inner pool, so `reserved()` at any level -reports the base pool's number. `SpillReplayPool` also turns one kind of refused `try_grow` into a -`grow`; see -[Final aggregates reading their spill files back](#final-aggregates-reading-their-spill-files-back). +reports the base pool's number. ### The unified pools @@ -463,18 +460,6 @@ hands every native plan in a task the same one and drops it when the task comple covers the whole task, so `CometExecIterator.close()` warns about memory still in use only when the task's last open native plan closes. -### Final aggregates reading their spill files back - -`SpillReplayPool` (`spill_replay.rs`) wraps both Comet pools to work around -[issue #6254](https://github.com/apache/datafusion-comet/issues/6254). Once one of DataFusion 55's -final aggregates has spilled, it reads its spill files back through an aggregate that cannot spill, -so a refused `try_grow` there fails the task. When the pool refuses such a request, -`SpillReplayPool` records it with the pool's `grow` instead, which skips `CometFairMemoryPool`'s -local checks and carries what Spark does not grant as overcommit. Every other refusal is passed on -unchanged. `spill_replay.rs` describes how the wrapper recognizes these requests and what that relies -on in DataFusion. [Issue #6583](https://github.com/apache/datafusion-comet/issues/6583) tracks -removing it. - ## How DataFusion consumes the pool Native operators reserve through DataFusion's `MemoryConsumer` / `MemoryReservation` API: diff --git a/native/core/src/execution/memory_pools/fair_pool.rs b/native/core/src/execution/memory_pools/fair_pool.rs index 7664157907e..86d5750f51e 100644 --- a/native/core/src/execution/memory_pools/fair_pool.rs +++ b/native/core/src/execution/memory_pools/fair_pool.rs @@ -21,7 +21,6 @@ use std::{ }; use super::spark_memory::SparkMemory; -use super::spill_replay::CLUSTERED_FINAL_AGGREGATE; use super::task_shared::RunningTasks; use datafusion::common::resources_err; use datafusion::execution::memory_pool::MemoryConsumer; @@ -154,9 +153,13 @@ impl Display for CometFairMemoryPool { } } +/// The prefix of the name DataFusion gives the consumer of a `ClusteredFinalAggregateStream`, the +/// final aggregate over input sorted on some or all of its keys. +const CLUSTERED_FINAL_AGGREGATE: &str = "ClusteredFinalAggregateStream["; + /// Whether a request from `consumer` is held to its fair limit and the task's share. /// -/// That is the case for every consumer that can spill, with one exception. DataFusion 55.2 +/// That is the case for every consumer that can spill, with one exception. DataFusion /// registers `ClusteredFinalAggregateStream` as able to spill even when its input is sorted on every /// grouping key, to work around apache/datafusion#17334, but it builds a spill path only for /// partially sorted input. Fully sorted, as in a `CometSortAggregateExec` over a native sort, a diff --git a/native/core/src/execution/memory_pools/mod.rs b/native/core/src/execution/memory_pools/mod.rs index 75339aa2558..0d1b8ce2aaa 100644 --- a/native/core/src/execution/memory_pools/mod.rs +++ b/native/core/src/execution/memory_pools/mod.rs @@ -20,7 +20,6 @@ mod fair_pool; pub mod logging_pool; mod plan_pool; mod spark_memory; -mod spill_replay; mod task_shared; #[cfg(test)] pub(crate) mod testing; @@ -30,7 +29,6 @@ use datafusion::execution::memory_pool::{MemoryPool, TrackConsumersPool, Unbound use fair_pool::CometFairMemoryPool; use jni::objects::{Global, JObject}; use spark_memory::SparkMemory; -use spill_replay::SpillReplayPool; use std::num::NonZeroUsize; use std::sync::Arc; use unified_pool::CometUnifiedMemoryPool; @@ -94,22 +92,16 @@ fn create_pool( match pool_type { MemoryPoolType::GreedyUnified => { acquire_task_shared_pool(task_attempt_id, running_tasks, || { - Arc::new(SpillReplayPool::new( - task_attempt_id, - tracked(CometUnifiedMemoryPool::with_spark(spark())), - )) + tracked(CometUnifiedMemoryPool::with_spark(spark())) }) } MemoryPoolType::FairUnified => { acquire_task_shared_pool(task_attempt_id, running_tasks, || { - Arc::new(SpillReplayPool::new( - task_attempt_id, - tracked(CometFairMemoryPool::with_spark( - spark(), - pool_size, - off_heap_size, - running_tasks.clone(), - )), + tracked(CometFairMemoryPool::with_spark( + spark(), + pool_size, + off_heap_size, + running_tasks.clone(), )) }) } @@ -123,7 +115,6 @@ fn create_pool( /// takes nothing from Spark or that the function did not create. pub(crate) fn overcommit(pool: &Arc) -> usize { let pool = task_shared::unwrap_task_shared(pool).unwrap_or(pool); - let pool = spill_replay::unwrap_spill_replay(pool).unwrap_or(pool); if let Some(tracked) = pool.downcast_ref::>() { tracked.inner().overcommit() } else if let Some(tracked) = pool.downcast_ref::>() { diff --git a/native/core/src/execution/memory_pools/spill_replay.rs b/native/core/src/execution/memory_pools/spill_replay.rs deleted file mode 100644 index dc3f9fabdd3..00000000000 --- a/native/core/src/execution/memory_pools/spill_replay.rs +++ /dev/null @@ -1,390 +0,0 @@ -// 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. - -//! Lets a final aggregate read its spill files back past its share of memory (#6254). -//! -//! Once one of DataFusion 55's final aggregates has spilled, it merges its sorted spill files and -//! replays them through an `ClusteredFinalAggregateStream` that has no way to spill, so a refused -//! memory request there fails the task. `FinalHashAggregateStream` does this, and so does -//! `ClusteredFinalAggregateStream` itself, which DataFusion uses when the input is sorted on some of -//! the grouping keys, and which Comet also runs for a Spark PartialMerge over such input (#6880). -//! So does `SingleHashAggregateStream`, which Comet runs for other Spark PartialMerges (#6857). -//! The merge reserves read buffers for as many spill files as fit, and those buffers belong to the -//! same consumer, so the replay often finds the consumer's share already taken. -//! -//! [`SpillReplayPool`] wraps a Comet pool. When the pool refuses a request from the replay, it -//! records the request with the pool's `grow` instead, which ignores `CometFairMemoryPool`'s limits -//! and carries what Spark doesn't grant as overcommit. -//! -//! This relies on the following in DataFusion 55.1, which a DataFusion upgrade has to re-check: -//! -//! - The three aggregates name their consumers `FinalHashAggregateStream[{partition}]`, -//! `ClusteredFinalAggregateStream[{partition}]` and `SingleHashAggregateStream[{partition}]`, and -//! their merge and replay reserve through sibling reservations of that consumer. -//! - A final aggregate grows one reservation while another of its reservations holds memory only -//! during the replay, while the merge holds its read buffers. Before that, the aggregate's table -//! is its only reservation holding memory, so a refusal stands and makes it spill. The merge -//! picks its files while nothing else is held, so a refusal there still limits how many it opens. -//! - The replay asks for memory only after it has aggregated a batch, so like a `grow`, the request -//! is for memory that already exists. -//! - The replay emits every finished group after each batch, so it holds about one batch of groups, -//! and releasing memory repays the overcommit first. -//! - `ClusteredFinalAggregateStream` registers as able to spill even when its input is sorted on -//! every grouping key, where it has no spill path, to work around apache/datafusion#17334. -//! `CometFairMemoryPool` checks its requests only against the pool for that reason (see -//! `limited_to_its_share` in `fair_pool.rs`). Drop that exception once #17334 is fixed and the -//! stream registers as able to spill only when it can. -//! -//! Remove this, as #6583 describes, once Comet's DataFusion has apache/datafusion#25383, which -//! leaves the replay room when the merge picks its files. The #6254 tests in `CometAggregateSuite` -//! fail without this on DataFusion 55.1, and its PartialMerge read-back test for #6857 fails -//! without it on 55.2, so they show whether the replay still needs it. - -use std::collections::HashMap; -use std::fmt; -use std::sync::Arc; - -use datafusion::common::{DataFusionError, Result}; -use datafusion::execution::memory_pool::{ - MemoryConsumer, MemoryLimit, MemoryPool, MemoryReservation, -}; -use log::debug; -use parking_lot::Mutex; - -/// Wraps a Comet pool and records the spill replay requests that it refuses; see the -/// [module documentation](self). Every other call, and every other refusal, is passed through -/// unchanged. -#[derive(Debug)] -pub(super) struct SpillReplayPool { - task_attempt_id: i64, - inner: Arc, - /// Bytes held by each final aggregate's consumer across all of its reservations, keyed by - /// [`MemoryConsumer::id`], because `reservation.size()` covers only one reservation. Other - /// consumers aren't tracked, so they never take the lock. - final_aggregates: Mutex>, -} - -impl SpillReplayPool { - pub(super) fn new(task_attempt_id: i64, inner: Arc) -> Self { - Self { - task_attempt_id, - inner, - final_aggregates: Mutex::new(HashMap::new()), - } - } - - /// Applies `update` to what `reservation`'s consumer holds, if it is a final aggregate. - fn track(&self, reservation: &MemoryReservation, update: impl FnOnce(&mut usize)) { - if is_final_aggregate(reservation.consumer()) { - if let Some(used) = self - .final_aggregates - .lock() - .get_mut(&reservation.consumer().id()) - { - update(used); - } - } - } - - /// Whether a refused request from `reservation` comes from a final aggregate reading its spill - /// files back, the only time one of its reservations grows while another holds memory. - fn is_spill_replay(&self, reservation: &MemoryReservation) -> bool { - is_final_aggregate(reservation.consumer()) - && self - .final_aggregates - .lock() - .get(&reservation.consumer().id()) - .is_some_and(|&consumer_used| consumer_used > reservation.size()) - } -} - -impl fmt::Display for SpillReplayPool { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt::Display::fmt(self.inner.as_ref(), f) - } -} - -impl MemoryPool for SpillReplayPool { - fn name(&self) -> &str { - self.inner.name() - } - - fn register(&self, consumer: &MemoryConsumer) { - if is_final_aggregate(consumer) { - self.final_aggregates.lock().insert(consumer.id(), 0); - } - self.inner.register(consumer) - } - - fn unregister(&self, consumer: &MemoryConsumer) { - if is_final_aggregate(consumer) { - self.final_aggregates.lock().remove(&consumer.id()); - } - self.inner.unregister(consumer) - } - - fn grow(&self, reservation: &MemoryReservation, additional: usize) { - self.inner.grow(reservation, additional); - self.track(reservation, |used| *used = used.saturating_add(additional)); - } - - fn shrink(&self, reservation: &MemoryReservation, shrink: usize) { - self.inner.shrink(reservation, shrink); - self.track(reservation, |used| *used = used.saturating_sub(shrink)); - } - - fn try_grow(&self, reservation: &MemoryReservation, additional: usize) -> Result<()> { - match self.inner.try_grow(reservation, additional) { - Ok(()) => {} - Err(DataFusionError::ResourcesExhausted(refusal)) - if self.is_spill_replay(reservation) => - { - debug!( - "Task {} records {additional} bytes for {} while it reads its spill files back: {refusal}", - self.task_attempt_id, - reservation.consumer().name() - ); - self.inner.grow(reservation, additional); - } - Err(e) => return Err(e), - } - self.track(reservation, |used| *used = used.saturating_add(additional)); - Ok(()) - } - - fn reserved(&self) -> usize { - self.inner.reserved() - } - - fn memory_limit(&self) -> MemoryLimit { - self.inner.memory_limit() - } -} - -/// The pool that `pool` wraps, if it is a [`SpillReplayPool`]. -pub(super) fn unwrap_spill_replay(pool: &Arc) -> Option<&Arc> { - pool.downcast_ref::() - .map(|replay| &replay.inner) -} - -/// The prefix of the name DataFusion gives the consumer of a `ClusteredFinalAggregateStream`, the -/// final aggregate over input sorted on some or all of its keys. DataFusion 55 called it -/// `OrderedFinalAggregateStream`. -pub(super) const CLUSTERED_FINAL_AGGREGATE: &str = "ClusteredFinalAggregateStream["; - -/// Whether `consumer` belongs to a final or single aggregate, whose spill replay can't spill. -fn is_final_aggregate(consumer: &MemoryConsumer) -> bool { - let name = consumer.name(); - name.starts_with("FinalHashAggregateStream[") - || name.starts_with(CLUSTERED_FINAL_AGGREGATE) - || name.starts_with("SingleHashAggregateStream[") -} - -#[cfg(test)] -mod tests { - use super::super::spark_memory::fake::FakeSpark; - use super::super::testing::spillable; - use super::super::{create_pool, overcommit, MemoryPoolConfig, MemoryPoolType, RunningTasks}; - use super::*; - use datafusion::execution::memory_pool::UnboundedMemoryPool; - - /// A pool of each type for a task that runs alone, built the way `createPlan` builds it and - /// connected to a fake Spark that grants at most 100 bytes. The fair pool's own limits are far - /// above that, so only Spark refuses. Task-shared pools are keyed by task attempt process-wide, - /// so each pool needs its own id. - fn each_pool_type( - task_attempt_ids: [i64; 2], - ) -> Vec<(&'static str, Arc, Arc)> { - [ - ("greedy_unified", MemoryPoolType::GreedyUnified), - ("fair_unified", MemoryPoolType::FairUnified), - ] - .into_iter() - .zip(task_attempt_ids) - .map(|((name, pool_type), task_attempt_id)| { - let fake = FakeSpark::with(100); - let config = MemoryPoolConfig::new(pool_type, 1000); - let pool = create_pool(&config, task_attempt_id, &RunningTasks::default(), || { - fake.memory() - }); - (name, pool, fake) - }) - .collect() - } - - /// A `fair_unified` pool of `pool_size` bytes for a task that runs alone, built the way - /// `createPlan` builds it and connected to a fake Spark that grants everything, so only the - /// pool's own limits refuse. - fn fair_pool(task_attempt_id: i64, pool_size: usize) -> (Arc, Arc) { - let fake = FakeSpark::with(usize::MAX); - let config = MemoryPoolConfig::new(MemoryPoolType::FairUnified, pool_size); - let pool = create_pool(&config, task_attempt_id, &RunningTasks::default(), || { - fake.memory() - }); - (pool, fake) - } - - #[test] - fn a_final_aggregate_reading_its_spill_files_back_carries_what_spark_refuses() { - for (name, pool, fake) in each_pool_type([-3011, -3012]) { - // Like DataFusion 55's final hash aggregate, whose spill merge and replay table are - // sibling reservations of one consumer. - let merge = spillable("FinalHashAggregateStream[0]", &pool); - let replay = merge.new_empty(); - merge.try_grow(90).unwrap(); - - // Spark grants 10 of the replay's 30 bytes, and the other 20 are overcommit. - replay.try_grow(30).unwrap(); - assert_eq!(pool.reserved(), 120, "{name}"); - assert_eq!(fake.held(), 100, "{name}"); - assert_eq!(overcommit(&pool), 20, "{name}"); - - // The replay emits groups and shrinks, which repays the overcommit before Spark. - replay.shrink(25); - assert_eq!(overcommit(&pool), 0, "{name}"); - assert_eq!(fake.held(), 95, "{name}"); - drop(merge); - drop(replay); - assert_eq!(pool.reserved(), 0, "{name}"); - assert_eq!(fake.held(), 0, "{name}"); - } - } - - #[test] - fn a_final_aggregate_reading_its_spill_files_back_may_pass_its_fair_limit() { - let (pool, fake) = fair_pool(-3013, 100); - let merge = spillable("FinalHashAggregateStream[0]", &pool); - let replay = merge.new_empty(); - merge.try_grow(90).unwrap(); - - // The aggregate is the only consumer, so its share is the whole pool. - replay.try_grow(30).unwrap(); - assert_eq!(pool.reserved(), 120); - assert_eq!(fake.held(), 120); - assert_eq!(overcommit(&pool), 0); - } - - #[test] - fn a_final_aggregate_reading_its_spill_files_back_may_pass_the_pool_limit() { - let (pool, fake) = fair_pool(-3014, 100); - let sort = spillable("ExternalSorter[0]", &pool); - sort.try_grow(70).unwrap(); - let merge = spillable("FinalHashAggregateStream[0]", &pool); - let replay = merge.new_empty(); - merge.try_grow(25).unwrap(); - - // 25 + 20 is within the aggregate's share of 50, but 70 + 25 + 20 is over the pool's 100. - replay.try_grow(20).unwrap(); - assert_eq!(pool.reserved(), 115); - assert_eq!(fake.held(), 115); - assert_eq!(overcommit(&pool), 0); - } - - #[test] - fn other_refusals_are_unchanged() { - for (name, pool, fake) in each_pool_type([-3015, -3016]) { - // While the aggregate reads its input, its table is the consumer's only reservation - // holding memory, so a refusal makes it spill. - let table = spillable("FinalHashAggregateStream[0]", &pool); - let replay = table.new_empty(); - table.try_grow(90).unwrap(); - assert!(table.try_grow(30).is_err(), "{name}"); - drop(table); - - // The merge picks its spill files while nothing else is held, so a refusal still - // limits how many it opens. - let merge = replay.new_empty(); - merge.try_grow(90).unwrap(); - assert!(merge.try_grow(30).is_err(), "{name}"); - drop(merge); - - // Any other operator with a sibling holding memory is still refused. - let sort = MemoryConsumer::new("ExternalSorterMerge[0]").register(&pool); - let sibling = sort.new_empty(); - sort.try_grow(90).unwrap(); - assert!(sibling.try_grow(30).is_err(), "{name}"); - assert_eq!(pool.reserved(), 90, "{name}"); - assert_eq!(fake.held(), 90, "{name}"); - } - } - - #[test] - fn a_failed_spark_call_during_the_replay_is_not_recorded() { - for (name, pool_type, task_attempt_id) in [ - ("greedy_unified", MemoryPoolType::GreedyUnified, -3017), - ("fair_unified", MemoryPoolType::FairUnified, -3018), - ] { - let fake = FakeSpark::failing(); - let config = MemoryPoolConfig::new(pool_type, 1000); - let pool = create_pool(&config, task_attempt_id, &RunningTasks::default(), || { - fake.memory() - }); - let merge = spillable("FinalHashAggregateStream[0]", &pool); - let replay = merge.new_empty(); - merge.grow(90); - - // Only a refusal is recorded. A JNI error goes back to the aggregate. - let err = replay.try_grow(30).unwrap_err(); - assert!( - !matches!(err, DataFusionError::ResourcesExhausted(_)), - "{name}: {err}" - ); - assert_eq!(pool.reserved(), 90, "{name}"); - } - } - - #[test] - fn a_final_aggregate_is_tracked_across_its_reservations_until_it_unregisters() { - let pool = Arc::new(SpillReplayPool::new( - -3019, - Arc::new(UnboundedMemoryPool::default()), - )); - let dyn_pool: Arc = Arc::clone(&pool) as _; - let merge = MemoryConsumer::new("FinalHashAggregateStream[0]").register(&dyn_pool); - let replay = merge.new_empty(); - merge.try_grow(90).unwrap(); - replay.grow(20); - replay.shrink(5); - let sort = MemoryConsumer::new("ExternalSorter[0]").register(&dyn_pool); - sort.grow(10); - let id = merge.consumer().id(); - assert_eq!(*pool.final_aggregates.lock(), HashMap::from([(id, 105)])); - - drop(merge); - drop(replay); - assert!(pool.final_aggregates.lock().is_empty()); - } - - #[test] - fn only_final_aggregates_replay_their_spill_files() { - for name in [ - "FinalHashAggregateStream[3]", - "ClusteredFinalAggregateStream[0]", - "SingleHashAggregateStream[0]", - ] { - assert!(is_final_aggregate(&MemoryConsumer::new(name)), "{name}"); - } - // Partial aggregates emit early instead of spilling. - for name in [ - "PartialHashAggregateStream[0]", - "ClusteredPartialAggregateStream[0]", - "ExternalSorterMerge[0]", - ] { - assert!(!is_final_aggregate(&MemoryConsumer::new(name)), "{name}"); - } - } -} diff --git a/native/core/src/execution/planner/aggregate.rs b/native/core/src/execution/planner/aggregate.rs index 3ac548807c1..3b1a61ff1f3 100644 --- a/native/core/src/execution/planner/aggregate.rs +++ b/native/core/src/execution/planner/aggregate.rs @@ -258,7 +258,7 @@ impl OperatorBuilder for HashAggBuilder { // after the keys, so the input must be the keys followed by native states (Spark's binary // collect buffers keep Single, and arrive unordered anyway). // Drop this on DataFusion 56, where the stream is ClusteredFinalAggregateStream - // (apache/datafusion#24697), and update the name prefix in `spill_replay.rs` (#6410). + // (apache/datafusion#24697), and update the name prefix in `fair_pool.rs` (#6410). let mode = if proto_mode == ProtoAggregateMode::PartialMerge && input_is_keys_then_states(agg, &aggr_expr, &schema)? && { diff --git a/spark/src/test/scala/org/apache/comet/exec/CometAggregateSuite.scala b/spark/src/test/scala/org/apache/comet/exec/CometAggregateSuite.scala index 1f1de4f9704..309a4ebac2c 100644 --- a/spark/src/test/scala/org/apache/comet/exec/CometAggregateSuite.scala +++ b/spark/src/test/scala/org/apache/comet/exec/CometAggregateSuite.scala @@ -360,8 +360,9 @@ class CometAggregateSuite extends CometTestBase with AdaptiveSparkPlanHelper { } test("PartialMerge over a sort-merge join on a prefix of its keys spills (issue #6880)") { - // The sorts under the join need more than a 2 or 8 MiB pool's fair share, so this uses 16 MiB. - withPartialMergeOverSortedPrefix(Seq(16)) { path => + // The sorts under the join need more than a 2 MiB pool's fair share, and with 12 MiB or more + // the PartialMerge fits without spilling, so this uses 8 MiB. + withPartialMergeOverSortedPrefix(Seq(8)) { path => // With the default rules, the join's hash partitioning on g satisfies the PartialMerge keyed // by (g, k), so the join, the partial aggregate and the PartialMerge run in one native plan, // and the PartialMerge sees its input sorted on g. The suite lets AQE broadcast up to 1g at From e9a639db7a485ecdf36fbcc6e58add6c81060cf0 Mon Sep 17 00:00:00 2001 From: Andy Grove Date: Wed, 4 Nov 2026 07:03:08 -0700 Subject: [PATCH 9/9] fix: pin iceberg-rust with the NaN bounds fix Move the andygrove/iceberg-rust fork pin to apache/iceberg-rust#3257 with apache/iceberg-rust main at 46e51d8 merged in. Main now includes apache/iceberg-rust#3539, which skips NaN min and max statistics when aggregating Parquet column bounds, so the native writer no longer records NaN manifest bounds for all-NaN float and double columns on Parquet 60. This fixes the Iceberg TestAggregatePushDown testNaN and testAllNaN failures, re-enables the NaN manifest metrics test, and drops the known issue from the docs. Closes #7242. --- docs/source/user-guide/latest/iceberg.md | 6 - .../user-guide/latest/migration-guide.md | 19 -- native/Cargo.lock | 175 ++++++++++++++++-- native/Cargo.toml | 6 +- native/native-executors/Cargo.lock | 175 ++++++++++++++++-- .../comet/CometIcebergWriteActionSuite.scala | 7 +- 6 files changed, 326 insertions(+), 62 deletions(-) diff --git a/docs/source/user-guide/latest/iceberg.md b/docs/source/user-guide/latest/iceberg.md index 2bce6a5c660..13f811a68c6 100644 --- a/docs/source/user-guide/latest/iceberg.md +++ b/docs/source/user-guide/latest/iceberg.md @@ -823,12 +823,6 @@ The native Iceberg writer is disabled by default. With `spark.comet.write.iceber iceberg-java rejects the value. The native writer also trims or lowercases a few other settings that iceberg-java reads as written ([#7008](https://github.com/apache/datafusion-comet/issues/7008)). -- **All-NaN `float` and `double` columns.** When a data file holds a column chunk with only NaN - values, the native writer records NaN as that column's lower and upper bound in the manifest. - iceberg-java records no bound, and the Iceberg spec does not allow NaN as a bound. This comes - from the Parquet writer, which writes NaN statistics for such a chunk since Parquet 60, and from - iceberg-rust, which copies them into the bounds - ([#7242](https://github.com/apache/datafusion-comet/issues/7242)). The physical differences that every native data file has, and why they are safe, are listed in [Accepted divergences](#accepted-divergences). diff --git a/docs/source/user-guide/latest/migration-guide.md b/docs/source/user-guide/latest/migration-guide.md index e239fbd821f..feaa15aab06 100644 --- a/docs/source/user-guide/latest/migration-guide.md +++ b/docs/source/user-guide/latest/migration-guide.md @@ -57,25 +57,6 @@ Treat setting one of these keys as a temporary measure. If you find you cannot s legacy behavior, please open an issue describing your use case so it can be considered before the key is removed. -## Upgrading to Comet 1.3.0 - -Comet `1.3.0` makes no behavior changes that need a `spark.comet.legacy.*` key. The known issue -below needs none either, but check whether it applies to your deployment. - -### Native Iceberg Writer Bounds for All-NaN Columns - -This applies only if you enable the native Iceberg writer with `spark.comet.write.iceberg.enabled`, -which is off by default. Comet `1.3.0` moves to Parquet 60, which writes NaN min and max statistics -for a `float` or `double` column chunk that holds only NaN values. Earlier versions wrote none. -The native writer copies those statistics into the data file's lower and upper bounds, so the -manifest records NaN as a bound where iceberg-java records none, and the Iceberg spec does not -allow NaN as a bound. Comet `1.2.0` and earlier do not write these bounds. - -The data and the NaN counts are unaffected, and no setting restores the previous bounds. Disable -`spark.comet.write.iceberg.enabled` to have iceberg-java write the files. The fix belongs in -iceberg-rust and is tracked in -[#7242](https://github.com/apache/datafusion-comet/issues/7242). - ## Upgrading to Comet 1.2.0 Comet `1.2.0` makes no behavior changes that need a `spark.comet.legacy.*` key. The changes below diff --git a/native/Cargo.lock b/native/Cargo.lock index e6e8e528003..2ce37547238 100644 --- a/native/Cargo.lock +++ b/native/Cargo.lock @@ -204,11 +204,20 @@ dependencies = [ "serde_json", "snap", "strum 0.28.0", - "thiserror", + "thiserror 2.0.21", "uuid", "zstd 0.13.3", ] +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + [[package]] name = "arc-swap" version = "1.9.3" @@ -2068,7 +2077,7 @@ dependencies = [ "serde", "serde_json", "simdutf8", - "thiserror", + "thiserror 2.0.21", ] [[package]] @@ -2088,7 +2097,7 @@ dependencies = [ "prost", "regex", "serde_json", - "thiserror", + "thiserror 2.0.21", ] [[package]] @@ -2793,7 +2802,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71958f69fb2de856c5dd51ac9377e986ca1aa5919f931bf5395a807277f889a0" dependencies = [ - "thiserror", + "thiserror 2.0.21", ] [[package]] @@ -3217,6 +3226,27 @@ dependencies = [ "version_check", ] +[[package]] +name = "geo-traits" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7c353d12a704ccfab1ba8bfb1a7fe6cb18b665bf89d37f4f7890edcd260206" +dependencies = [ + "geo-types", +] + +[[package]] +name = "geo-types" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777d18aa0f12f8b285331cd867133ee14422b3f023f6d388034c47d43e28786a" +dependencies = [ + "approx", + "num-traits", + "serde", + "thiserror 2.0.21", +] + [[package]] name = "getrandom" version = "0.2.17" @@ -3561,7 +3591,7 @@ dependencies = [ [[package]] name = "iceberg" version = "0.10.1" -source = "git+https://github.com/andygrove/iceberg-rust?rev=1f52867182e97acef3150f39838bfa9b2c9b81e9#1f52867182e97acef3150f39838bfa9b2c9b81e9" +source = "git+https://github.com/andygrove/iceberg-rust?rev=62f862468936e6cd66cfb3ac957b8cf567bcfa4f#62f862468936e6cd66cfb3ac957b8cf567bcfa4f" dependencies = [ "aes-gcm", "anyhow", @@ -3596,6 +3626,7 @@ dependencies = [ "once_cell", "ordered-float 4.6.0", "parquet", + "parquet-geospatial", "rand 0.9.5", "reqwest 0.12.28", "roaring", @@ -3619,7 +3650,7 @@ dependencies = [ [[package]] name = "iceberg-property-macro" version = "0.10.1" -source = "git+https://github.com/andygrove/iceberg-rust?rev=1f52867182e97acef3150f39838bfa9b2c9b81e9#1f52867182e97acef3150f39838bfa9b2c9b81e9" +source = "git+https://github.com/andygrove/iceberg-rust?rev=62f862468936e6cd66cfb3ac957b8cf567bcfa4f#62f862468936e6cd66cfb3ac957b8cf567bcfa4f" dependencies = [ "proc-macro2", "quote", @@ -3629,7 +3660,7 @@ dependencies = [ [[package]] name = "iceberg-storage-opendal" version = "0.10.1" -source = "git+https://github.com/andygrove/iceberg-rust?rev=1f52867182e97acef3150f39838bfa9b2c9b81e9#1f52867182e97acef3150f39838bfa9b2c9b81e9" +source = "git+https://github.com/andygrove/iceberg-rust?rev=62f862468936e6cd66cfb3ac957b8cf567bcfa4f#62f862468936e6cd66cfb3ac957b8cf567bcfa4f" dependencies = [ "anyhow", "async-trait", @@ -3951,7 +3982,7 @@ dependencies = [ "libloading", "log", "simd_cesu8", - "thiserror", + "thiserror 2.0.21", "walkdir", "windows-link", ] @@ -4221,7 +4252,7 @@ dependencies = [ "serde-value", "serde_json", "serde_yaml", - "thiserror", + "thiserror 2.0.21", "thread-id", "typemap-ors", "unicode-segmentation", @@ -4484,6 +4515,28 @@ dependencies = [ "libm", ] +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "object" version = "0.37.3" @@ -4526,7 +4579,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "thiserror", + "thiserror 2.0.21", "tokio", "tracing", "url", @@ -4941,6 +4994,7 @@ dependencies = [ "num-integer", "num-traits", "object_store", + "parquet-geospatial", "parquet-variant", "parquet-variant-compute", "ring", @@ -4952,6 +5006,19 @@ dependencies = [ "zstd 0.14.3", ] +[[package]] +name = "parquet-geospatial" +version = "60.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eef66af500dd4e6f546d88ed582277559f4dba847ad0f1388c118ea27908fddb" +dependencies = [ + "arrow-schema", + "geo-traits", + "serde", + "serde_json", + "wkb", +] + [[package]] name = "parquet-variant" version = "60.1.0" @@ -5259,7 +5326,7 @@ dependencies = [ "spin 0.10.1", "symbolic-demangle", "tempfile", - "thiserror", + "thiserror 2.0.21", ] [[package]] @@ -5291,6 +5358,15 @@ dependencies = [ "syn 3.0.9", ] +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + [[package]] name = "proc-macro2" version = "1.0.107" @@ -5494,7 +5570,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror", + "thiserror 2.0.21", "tokio", "tracing", "web-time", @@ -5517,7 +5593,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror", + "thiserror 2.0.21", "tinyvec", "tracing", "web-time", @@ -6708,13 +6784,33 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + [[package]] name = "thiserror" version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.21", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] @@ -6897,6 +6993,36 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml_datetime" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b86d767906c6c42421dcba507eb9d203e779497710a47782a224bb871653053" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.18+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec6e78bd70db9420d8d212fa9dc97f116448a1ceff5d00eabb991d407e21396" +dependencies = [ + "indexmap 2.14.2", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baa693a8032d7e1cada7d0041e96126df243179ff061456783ac7f12bda4744c" +dependencies = [ + "winnow", +] + [[package]] name = "tower" version = "0.5.3" @@ -7472,12 +7598,33 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + [[package]] name = "wit-bindgen" version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" +[[package]] +name = "wkb" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04ab2f2845abe967a213998446345a1a6fc9a8f318cd88f668a8e507861d13bc" +dependencies = [ + "byteorder", + "geo-traits", + "num_enum", + "thiserror 1.0.69", +] + [[package]] name = "writeable" version = "0.6.4" diff --git a/native/Cargo.toml b/native/Cargo.toml index e3f0a25024f..555a59913b5 100644 --- a/native/Cargo.toml +++ b/native/Cargo.toml @@ -89,11 +89,11 @@ aws-sdk-sts = { version = "1.114.0", default-features = false } # version is on our arrow: 0.10.1 requires arrow/parquet ^58. Move to a plain # version requirement once a release ships on arrow 60. Bump policy: #5645. # The revision is on the andygrove/iceberg-rust fork: apache/iceberg-rust#3257 (Arrow 60, -# not merged yet) with apache/iceberg-rust main at b154603 merged in, because that PR's +# not merged yet) with apache/iceberg-rust main at 46e51d8 merged in, because that PR's # head is behind the main revision Comet builds against. Move back to an # upstream main revision once #3257 merges. -iceberg = { git = "https://github.com/andygrove/iceberg-rust", rev = "1f52867182e97acef3150f39838bfa9b2c9b81e9" } -iceberg-storage-opendal = { git = "https://github.com/andygrove/iceberg-rust", rev = "1f52867182e97acef3150f39838bfa9b2c9b81e9", features = ["opendal-memory", "opendal-fs", "opendal-s3", "opendal-gcs", "opendal-oss", "opendal-azdls"] } +iceberg = { git = "https://github.com/andygrove/iceberg-rust", rev = "62f862468936e6cd66cfb3ac957b8cf567bcfa4f" } +iceberg-storage-opendal = { git = "https://github.com/andygrove/iceberg-rust", rev = "62f862468936e6cd66cfb3ac957b8cf567bcfa4f", features = ["opendal-memory", "opendal-fs", "opendal-s3", "opendal-gcs", "opendal-oss", "opendal-azdls"] } reqsign-core = "3" [profile.release] diff --git a/native/native-executors/Cargo.lock b/native/native-executors/Cargo.lock index 387a94871c3..2dc0d8760af 100644 --- a/native/native-executors/Cargo.lock +++ b/native/native-executors/Cargo.lock @@ -180,11 +180,20 @@ dependencies = [ "serde_json", "snap", "strum 0.28.0", - "thiserror", + "thiserror 2.0.21", "uuid", "zstd 0.13.3", ] +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + [[package]] name = "ar_archive_writer" version = "0.5.3" @@ -1929,7 +1938,7 @@ dependencies = [ "serde", "serde_json", "simdutf8", - "thiserror", + "thiserror 2.0.21", ] [[package]] @@ -1947,7 +1956,7 @@ dependencies = [ "prost", "regex", "serde_json", - "thiserror", + "thiserror 2.0.21", ] [[package]] @@ -2700,7 +2709,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71958f69fb2de856c5dd51ac9377e986ca1aa5919f931bf5395a807277f889a0" dependencies = [ - "thiserror", + "thiserror 2.0.21", ] [[package]] @@ -3109,6 +3118,27 @@ dependencies = [ "version_check", ] +[[package]] +name = "geo-traits" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7c353d12a704ccfab1ba8bfb1a7fe6cb18b665bf89d37f4f7890edcd260206" +dependencies = [ + "geo-types", +] + +[[package]] +name = "geo-types" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777d18aa0f12f8b285331cd867133ee14422b3f023f6d388034c47d43e28786a" +dependencies = [ + "approx", + "num-traits", + "serde", + "thiserror 2.0.21", +] + [[package]] name = "getrandom" version = "0.2.17" @@ -3459,7 +3489,7 @@ dependencies = [ [[package]] name = "iceberg" version = "0.10.1" -source = "git+https://github.com/andygrove/iceberg-rust?rev=1f52867182e97acef3150f39838bfa9b2c9b81e9#1f52867182e97acef3150f39838bfa9b2c9b81e9" +source = "git+https://github.com/andygrove/iceberg-rust?rev=62f862468936e6cd66cfb3ac957b8cf567bcfa4f#62f862468936e6cd66cfb3ac957b8cf567bcfa4f" dependencies = [ "aes-gcm", "anyhow", @@ -3494,6 +3524,7 @@ dependencies = [ "once_cell", "ordered-float 4.6.0", "parquet", + "parquet-geospatial", "rand 0.9.5", "reqwest 0.12.28", "roaring", @@ -3517,7 +3548,7 @@ dependencies = [ [[package]] name = "iceberg-property-macro" version = "0.10.1" -source = "git+https://github.com/andygrove/iceberg-rust?rev=1f52867182e97acef3150f39838bfa9b2c9b81e9#1f52867182e97acef3150f39838bfa9b2c9b81e9" +source = "git+https://github.com/andygrove/iceberg-rust?rev=62f862468936e6cd66cfb3ac957b8cf567bcfa4f#62f862468936e6cd66cfb3ac957b8cf567bcfa4f" dependencies = [ "proc-macro2", "quote", @@ -3527,7 +3558,7 @@ dependencies = [ [[package]] name = "iceberg-storage-opendal" version = "0.10.1" -source = "git+https://github.com/andygrove/iceberg-rust?rev=1f52867182e97acef3150f39838bfa9b2c9b81e9#1f52867182e97acef3150f39838bfa9b2c9b81e9" +source = "git+https://github.com/andygrove/iceberg-rust?rev=62f862468936e6cd66cfb3ac957b8cf567bcfa4f#62f862468936e6cd66cfb3ac957b8cf567bcfa4f" dependencies = [ "anyhow", "async-trait", @@ -3818,7 +3849,7 @@ dependencies = [ "jni-sys", "log", "simd_cesu8", - "thiserror", + "thiserror 2.0.21", "walkdir", "windows-link", ] @@ -4069,7 +4100,7 @@ dependencies = [ "serde-value", "serde_json", "serde_yaml", - "thiserror", + "thiserror 2.0.21", "thread-id", "typemap-ors", "unicode-segmentation", @@ -4324,6 +4355,28 @@ dependencies = [ "libm", ] +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "objc2-core-foundation" version = "0.3.2" @@ -4385,7 +4438,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "thiserror", + "thiserror 2.0.21", "tokio", "tracing", "url", @@ -4761,6 +4814,7 @@ dependencies = [ "num-integer", "num-traits", "object_store", + "parquet-geospatial", "parquet-variant", "parquet-variant-compute", "ring", @@ -4772,6 +4826,19 @@ dependencies = [ "zstd 0.14.3", ] +[[package]] +name = "parquet-geospatial" +version = "60.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eef66af500dd4e6f546d88ed582277559f4dba847ad0f1388c118ea27908fddb" +dependencies = [ + "arrow-schema", + "geo-traits", + "serde", + "serde_json", + "wkb", +] + [[package]] name = "parquet-variant" version = "60.1.0" @@ -5036,6 +5103,15 @@ dependencies = [ "syn 3.0.9", ] +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + [[package]] name = "proc-macro2" version = "1.0.107" @@ -5205,7 +5281,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror", + "thiserror 2.0.21", "tokio", "tracing", "web-time", @@ -5228,7 +5304,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror", + "thiserror 2.0.21", "tinyvec", "tracing", "web-time", @@ -6399,19 +6475,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.3", "once_cell", "rustix", "windows-sys 0.61.2", ] +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + [[package]] name = "thiserror" version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.21", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] @@ -6554,6 +6650,36 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml_datetime" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b86d767906c6c42421dcba507eb9d203e779497710a47782a224bb871653053" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.18+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec6e78bd70db9420d8d212fa9dc97f116448a1ceff5d00eabb991d407e21396" +dependencies = [ + "indexmap 2.14.2", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baa693a8032d7e1cada7d0041e96126df243179ff061456783ac7f12bda4744c" +dependencies = [ + "winnow", +] + [[package]] name = "tonic" version = "0.14.9" @@ -7278,12 +7404,33 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + [[package]] name = "wit-bindgen" version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" +[[package]] +name = "wkb" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04ab2f2845abe967a213998446345a1a6fc9a8f318cd88f668a8e507861d13bc" +dependencies = [ + "byteorder", + "geo-traits", + "num_enum", + "thiserror 1.0.69", +] + [[package]] name = "writeable" version = "0.6.4" diff --git a/spark/src/test/scala/org/apache/comet/CometIcebergWriteActionSuite.scala b/spark/src/test/scala/org/apache/comet/CometIcebergWriteActionSuite.scala index 0e40f338fa0..6f752267a63 100644 --- a/spark/src/test/scala/org/apache/comet/CometIcebergWriteActionSuite.scala +++ b/spark/src/test/scala/org/apache/comet/CometIcebergWriteActionSuite.scala @@ -2050,12 +2050,7 @@ class CometIcebergWriteActionSuite // value is NaN. The native path must reproduce those decisions via the JVM-side metrics // rebuild, so write identical data through both paths and pin the aggregated per-column // manifest metrics against each other. - // - // Ignored while Comet is on Parquet 60: it writes NaN statistics for an all-NaN column chunk, - // and iceberg-rust copies them into the manifest bounds, where iceberg-java records none. - // Re-enable once iceberg-rust skips NaN bounds. - // https://github.com/apache/datafusion-comet/issues/7242 - ignore("native acceleration: NaN float/double manifest metrics match the JVM writer") { + test("native acceleration: NaN float/double manifest metrics match the JVM writer") { assumeNativeAcceleration() withIcebergCatalog { _ => Seq("nan_native", "nan_jvm").foreach { t =>