diff --git a/Cargo.lock b/Cargo.lock index 247de94cdd..64838e9bfd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -39,9 +39,9 @@ checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" [[package]] name = "alloc-stdlib" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" dependencies = [ "alloc-no-stdlib", ] @@ -128,9 +128,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.102" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" [[package]] name = "approx" @@ -152,9 +152,9 @@ dependencies = [ [[package]] name = "arc-swap" -version = "1.9.1" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" +checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" dependencies = [ "rustversion", ] @@ -173,15 +173,15 @@ checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" [[package]] name = "arrow" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cfdd0833e32a9874d2b55089333ad310c0be208aafa277385ce2461dec90be3" +checksum = "61d285d16bce7d0be61912f7928342b673067b6b7d7ef6cc179258ba7de1fecf" dependencies = [ "arrow-arith", "arrow-array", @@ -200,9 +200,9 @@ dependencies = [ [[package]] name = "arrow-arith" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a41203398f0eaa6f7ec8e62c0da742a21abf282c148fc157f6c35c90e29981a" +checksum = "757ef1836251e88222542a7da2623bc1c9cb9e20afefa6db2c41e79991cd91d4" dependencies = [ "arrow-array", "arrow-buffer", @@ -214,9 +214,9 @@ dependencies = [ [[package]] name = "arrow-array" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae33dad492b7df00a217563a7b0ef2874df68a0deea1b1a3acf628152f7f7a69" +checksum = "bc9a4a4b2b5ecd0e04df03471661cb61f28bed3c7fd50994715129b01b2edb97" dependencies = [ "ahash", "arrow-buffer", @@ -233,9 +233,9 @@ dependencies = [ [[package]] name = "arrow-avro" -version = "58.3.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "049230728cd6e093088c8d231b4beede184e35cad7777c1505c0d5a8571f4376" +checksum = "9fb45cd6bd2b25c0965793b83200eaca82214273a8030fbbc2d783e4c7c65a61" dependencies = [ "arrow-array", "arrow-buffer", @@ -246,7 +246,7 @@ dependencies = [ "flate2", "indexmap 2.14.0", "liblzma", - "rand 0.9.4", + "rand 0.9.5", "serde", "serde_json", "snap", @@ -257,21 +257,21 @@ dependencies = [ [[package]] name = "arrow-buffer" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9552f96391c005e6ab449fa941420935e7e062489b12b8b1b08879b2163f5b5" +checksum = "c12b576ef18c1deb80925a248b25ad84f419198d791b8e293fc6aaa60441fe90" dependencies = [ "bytes", "half", - "num-bigint", + "num-bigint 0.5.1", "num-traits", ] [[package]] name = "arrow-cast" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a8a327c9649f30d8406995f27642b68df354713cca3baaaf100f076f18d5f34" +checksum = "68338a9096a5dc9bc11927c58c43a8526d96bf6abd2012ef6c0c9f505991cc79" dependencies = [ "arrow-array", "arrow-buffer", @@ -280,7 +280,7 @@ dependencies = [ "arrow-schema", "arrow-select", "atoi", - "base64", + "base64 0.23.1", "chrono", "comfy-table", "half", @@ -291,9 +291,9 @@ dependencies = [ [[package]] name = "arrow-csv" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af0dd6d90d1955e9f9a014c1e563ee8aeffc21909085d25623e1da44d96eca26" +checksum = "25011b52b346407d497ef0030e12b45e4f2d0cc279efc09c4f3d09106db30e36" dependencies = [ "arrow-array", "arrow-cast", @@ -306,9 +306,9 @@ dependencies = [ [[package]] name = "arrow-data" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b24852db04738907e06c04ea61e42fe7fda962a34513022dc0d0e754fb7976b" +checksum = "723fe4aeed7604e00b9883a465af4ff0a0e6c44c03e41a68c3d1cbc403e0e44d" dependencies = [ "arrow-buffer", "arrow-schema", @@ -319,9 +319,9 @@ dependencies = [ [[package]] name = "arrow-flight" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2dbe34824c639e43136af8f106992792ab456540d54b880bc320a3192502d2e" +checksum = "2bebfacc9d71f0728f6774164e4d4254b5e504d2b46812d0512d8290ec119a64" dependencies = [ "arrow-arith", "arrow-array", @@ -334,11 +334,10 @@ dependencies = [ "arrow-schema", "arrow-select", "arrow-string", - "base64", + "base64 0.23.1", "bytes", "futures", "once_cell", - "paste", "prost", "prost-types", "tonic", @@ -347,9 +346,9 @@ dependencies = [ [[package]] name = "arrow-ipc" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29a908a11fcfb3fb2f6730f4ac15e367bc644e419155e96238f68cf3adde572b" +checksum = "149437b14371f5b9ec60f5ddc751483ae99d7a7072653c0075e5e469156eea7b" dependencies = [ "arrow-array", "arrow-buffer", @@ -363,9 +362,9 @@ dependencies = [ [[package]] name = "arrow-json" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a96aed3931c076adee39ec2a40d8219fc7f09e79bcdaca1df16272993e1e14" +checksum = "f18b9123ccfec418a663f821c9a034af339711678c11ffe00d3ec07da5ff9f7e" dependencies = [ "arrow-array", "arrow-buffer", @@ -388,9 +387,9 @@ dependencies = [ [[package]] name = "arrow-ord" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63a083ec750f5c043f02946b4baf05fcdbb55f4560a3277055caca5cc99f3eb0" +checksum = "e6c08dff0686cf23ca4f562803f191ccbeb726dbae6309cd4b4aaf65e0f2c979" dependencies = [ "arrow-array", "arrow-buffer", @@ -401,9 +400,9 @@ dependencies = [ [[package]] name = "arrow-row" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514ba0ef0d4c5896202dae736251ce415abb43a950bed570fb7981b8716c0e4c" +checksum = "bbec439386df71ad570e6758a946111322b9e9dc8db83b5527321f0b4c9119c2" dependencies = [ "arrow-array", "arrow-buffer", @@ -414,9 +413,9 @@ dependencies = [ [[package]] name = "arrow-schema" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21ca356ad6425cecb6eb7b28e4f659f1ee7880fbb1a16127de7dd62901efee9e" +checksum = "e6fed2ca0d1eade57e811cbe73b98ad50cc08a1183e13b2d2aa43a7df593f40e" dependencies = [ "serde_core", "serde_json", @@ -424,9 +423,9 @@ dependencies = [ [[package]] name = "arrow-select" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58da39eb3d8350ad4a549e5c2bc49284dac554016c69829310350f1731b0aad" +checksum = "466b19cf75130b891dc1b23a84b343c714c62c64c9c62e365c76aa0ff90a53fb" dependencies = [ "ahash", "arrow-array", @@ -438,9 +437,9 @@ dependencies = [ [[package]] name = "arrow-string" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6789b388467525e3271326b6b4915666ecfdf5142aef09779445c954b67543c" +checksum = "c838a25bb3691e919e0f617616ac51a4ff8517a952e29ca133cf0c22b2ce65b1" dependencies = [ "arrow-array", "arrow-buffer", @@ -455,15 +454,15 @@ dependencies = [ [[package]] name = "astral-tokio-tar" -version = "0.6.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb50a7aae84a03bf55b067832bc376f4961b790c97e64d3eacee97d389b90277" +checksum = "b18457efd137254e016bbde5e1d88df61c4e1a5ae2223746e56123bac6af2463" dependencies = [ - "filetime", "futures-core", "libc", "portable-atomic", "rustc-hash", + "rustix 1.1.4", "tokio", "tokio-stream", "xattr", @@ -489,7 +488,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -511,7 +510,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -522,7 +521,7 @@ checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" dependencies = [ "proc-macro2", "quote", - "syn 3.0.1", + "syn 3.0.3", ] [[package]] @@ -557,9 +556,9 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-config" -version = "1.10.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b180a3c8b55960db3426d8964b8745e652466a1a49fe1a2eda828046d30b5e4" +checksum = "701418aa459dac33e50a0f8e818e5662a16bc018a6ac7423659b70f3799d67a8" dependencies = [ "aws-credential-types", "aws-runtime", @@ -577,8 +576,8 @@ dependencies = [ "bytes", "fastrand", "hex", - "http 1.5.0", - "sha1 0.10.6", + "http 1.4.2", + "sha1 0.10.7", "time", "tokio", "tracing", @@ -600,9 +599,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.17.0" +version = "1.17.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ec2f1fc3ec205783a5da9a7e6c1509cc69dedf09a1949e412c1e18469326d00" +checksum = "00bdb5da18dac48ca2cc7cd4a98e533e8635a58e2361d13a1a4ee3888e0d72f1" dependencies = [ "aws-lc-sys", "zeroize", @@ -610,21 +609,22 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.41.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a2f9779ce85b93ab6170dd940ad0169b5766ff848247aff13bb788b832fe3f4" +checksum = "43103168cc76fe62678a375e722fc9cb3a0146159ac5828bc4f0dfd755c2224c" dependencies = [ "cc", "cmake", "dunce", "fs_extra", + "pkg-config", ] [[package]] name = "aws-runtime" -version = "1.9.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9007227e10b5fed2f3e0a2beff489211e2b5604c400b7a9d5d81ca9d64c24bb" +checksum = "a6b50a43f3ccdf331521c6d6c68b7cc9668b6e09d439ebda9569df5722324d76" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -637,8 +637,8 @@ dependencies = [ "bytes", "bytes-utils", "fastrand", - "http 1.5.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "percent-encoding", "pin-project-lite", "tracing", @@ -647,9 +647,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.105.0" +version = "1.104.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ffd0fbe7873cb548a7aa60f9573c268fff94155397fd4f14dc9f1ecaaab8516" +checksum = "b53416d16c278234845392e38d93bd4481d2f09daa0f005a2277f0aa91f59c22" dependencies = [ "arc-swap", "aws-credential-types", @@ -666,16 +666,16 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", - "http 1.5.0", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-ssooidc" -version = "1.107.0" +version = "1.106.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175763eb222a46377df7aa257a3bca980ab3e96703fefc8f4d0b8da6ad2e254c" +checksum = "cc9b706c3305ed0285d5b1b696c747aa34950f830fb03e3e6c76890f99b9f188" dependencies = [ "arc-swap", "aws-credential-types", @@ -692,16 +692,16 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", - "http 1.5.0", + "http 1.4.2", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sts" -version = "1.110.0" +version = "1.109.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b14781dfbff48984017d57167b6ea0b6471c6920ec52b44a2677c7feb3c13" +checksum = "32d214cdfa5bbe17f117e76a7643fadf32a5234fb597322ef8b1fb4b2f17dbbd" dependencies = [ "arc-swap", "aws-credential-types", @@ -719,7 +719,7 @@ dependencies = [ "aws-types", "fastrand", "http 0.2.12", - "http 1.5.0", + "http 1.4.2", "regex-lite", "tracing", ] @@ -739,7 +739,7 @@ dependencies = [ "hex", "hmac", "http 0.2.12", - "http 1.5.0", + "http 1.4.2", "percent-encoding", "sha2 0.11.0", "time", @@ -769,8 +769,8 @@ dependencies = [ "bytes-utils", "futures-core", "futures-util", - "http 1.5.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "http-body-util", "percent-encoding", "pin-project-lite", @@ -788,7 +788,7 @@ dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", "h2", - "http 1.5.0", + "http 1.4.2", "hyper", "hyper-rustls", "hyper-util", @@ -851,9 +851,9 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", - "http 1.5.0", + "http 1.4.2", "http-body 0.4.6", - "http-body 1.0.1", + "http-body 1.1.0", "http-body-util", "pin-project-lite", "pin-utils", @@ -872,7 +872,7 @@ dependencies = [ "aws-smithy-types", "bytes", "http 0.2.12", - "http 1.5.0", + "http 1.4.2", "pin-project-lite", "tokio", "tracing", @@ -887,7 +887,7 @@ checksum = "221eaa237ddf1ca79b60d1372aad77e47f9c0ea5b3ce5099da8c61d027dc77b3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -898,7 +898,7 @@ checksum = "7d56e0a4e53127a632224e43633b0fe045fa9e1e3cfc68b9830f1115e103f910" dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", - "http 1.5.0", + "http 1.4.2", ] [[package]] @@ -911,9 +911,9 @@ dependencies = [ "bytes", "bytes-utils", "http 0.2.12", - "http 1.5.0", + "http 1.4.2", "http-body 0.4.6", - "http-body 1.0.1", + "http-body 1.1.0", "http-body-util", "itoa", "num-integer", @@ -961,8 +961,8 @@ dependencies = [ "bytes", "form_urlencoded", "futures-util", - "http 1.5.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "http-body-util", "hyper", "hyper-util", @@ -992,8 +992,8 @@ checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" dependencies = [ "bytes", "futures-core", - "http 1.5.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "http-body-util", "mime", "pin-project-lite", @@ -1030,7 +1030,7 @@ version = "54.0.0" dependencies = [ "ballista", "ballista-core", - "clap 4.6.3", + "clap 4.6.4", "criterion", "datafusion", "datafusion-proto", @@ -1071,7 +1071,7 @@ version = "54.0.0" dependencies = [ "ballista", "chrono", - "clap 4.6.3", + "clap 4.6.4", "config", "console_error_panic_hook", "critical-section", @@ -1112,7 +1112,7 @@ dependencies = [ "aws-config", "aws-credential-types", "chrono", - "clap 4.6.3", + "clap 4.6.4", "datafusion", "datafusion-functions-aggregate-common", "datafusion-proto", @@ -1176,7 +1176,7 @@ dependencies = [ "axum", "ballista-core", "bytesize", - "clap 4.6.3", + "clap 4.6.4", "dashmap", "datafusion", "datafusion-proto", @@ -1208,7 +1208,7 @@ dependencies = [ "async-trait", "axum", "ballista-core", - "clap 4.6.3", + "clap 4.6.4", "dashmap", "datafusion", "datafusion-functions-aggregate-common", @@ -1216,7 +1216,7 @@ dependencies = [ "datafusion-substrait", "futures", "graphviz-rust", - "http 1.5.0", + "http 1.4.2", "insta", "itertools 0.15.0", "log", @@ -1249,6 +1249,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + [[package]] name = "base64-simd" version = "0.8.0" @@ -1267,12 +1273,12 @@ checksum = "0375f7f3df163a52a06807f2150bac9a5da1933864ed40d52dda7dcd7cfa193b" dependencies = [ "beamterm-data", "beamterm-unicode", - "bitflags 2.13.0", + "bitflags 2.13.1", "compact_str", "glow", "lru 0.16.4", "rustc-hash", - "thiserror 2.0.18", + "thiserror 2.0.19", "unicode-width 0.2.2", ] @@ -1284,7 +1290,7 @@ checksum = "f21ff1fc630079352bae9b024f85519bf1f641cf7f326623f4c0b59f7ea834fd" dependencies = [ "compact_str", "miniz_oxide 0.9.1", - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] @@ -1295,12 +1301,12 @@ checksum = "d8db76d04d575a0534ad5dba63acc05ccbe69597f977f11c59a612cbea199112" dependencies = [ "beamterm-core", "beamterm-data", - "bitflags 2.13.0", + "bitflags 2.13.1", "compact_str", "console_error_panic_hook", "glow", "js-sys", - "thiserror 2.0.18", + "thiserror 2.0.19", "unicode-width 0.2.2", "wasm-bindgen", "wasm-bindgen-futures", @@ -1324,7 +1330,7 @@ checksum = "4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695" dependencies = [ "autocfg", "libm", - "num-bigint", + "num-bigint 0.4.8", "num-integer", "num-traits", ] @@ -1352,18 +1358,18 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.13.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" dependencies = [ "serde_core", ] [[package]] name = "bitvec" -version = "1.0.1" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" dependencies = [ "funty", "radium", @@ -1419,8 +1425,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee04c4c84f1f811b017f2fbb7dd8815c976e7ca98593de9c1e2afad0f636bff4" dependencies = [ "async-stream", - "base64", - "bitflags 2.13.0", + "base64 0.22.1", + "bitflags 2.13.1", "bollard-buildkit-proto", "bollard-stubs", "bytes", @@ -1428,7 +1434,7 @@ dependencies = [ "futures-util", "hex", "home", - "http 1.5.0", + "http 1.4.2", "http-body-util", "hyper", "hyper-named-pipe", @@ -1438,7 +1444,7 @@ dependencies = [ "log", "num", "pin-project-lite", - "rand 0.9.4", + "rand 0.9.5", "rustls", "rustls-native-certs", "rustls-pki-types", @@ -1446,7 +1452,7 @@ dependencies = [ "serde_derive", "serde_json", "serde_urlencoded", - "thiserror 2.0.18", + "thiserror 2.0.19", "time", "tokio", "tokio-stream", @@ -1476,7 +1482,7 @@ version = "1.52.1-rc.29.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f0a8ca8799131c1837d1282c3f81f31e76ceb0ce426e04a7fe1ccee3287c066" dependencies = [ - "base64", + "base64 0.22.1", "bollard-buildkit-proto", "bytes", "prost", @@ -1488,9 +1494,9 @@ dependencies = [ [[package]] name = "brotli" -version = "8.0.3" +version = "8.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8119e4516436f5708bbc474a9d395bf12f1b5395e93a92a56e647ac3388c8610" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1499,9 +1505,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "5.0.1" +version = "5.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5962523e1b92ce1b5e793d9169b9943eece10d39f62550bc04bb605d75b94924" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1530,21 +1536,15 @@ checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" [[package]] name = "bytemuck" -version = "1.25.0" +version = "1.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" [[package]] name = "bytes" -version = "1.11.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" [[package]] name = "bytes-utils" @@ -1558,9 +1558,9 @@ dependencies = [ [[package]] name = "bytesize" -version = "2.7.0" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7354288c522e7e980fafd2075d63d1285794c3a6a16cdd492f189ea406e5f18b" +checksum = "3d7c8918969267b2932ffd5655509bbbea0833823058c378876953217f5fc50e" [[package]] name = "bzip2" @@ -1588,9 +1588,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.64" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad887fd958be91b5098c0248def011f4523ab786cd411be668777e55063501f" +checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" dependencies = [ "find-msvc-tools", "jobserver", @@ -1606,15 +1606,15 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" [[package]] name = "chacha20" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" dependencies = [ "cfg-if", "cpufeatures 0.3.0", @@ -1683,9 +1683,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.3" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fb99565819980999fb7b4a1796046a5c949e6d4ff132cf5fadf5a641e20d776" +checksum = "d91e0c145792ef73a6ad36d27c75ac09f1832222a3c209689d90f534685ee5b7" dependencies = [ "clap_builder", "clap_derive", @@ -1705,14 +1705,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.3" +version = "4.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f2392eae7f16557a3d727ef3a12e57b2b2ca6f98566a5f4fb41ffe305df077" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.3", ] [[package]] @@ -1821,9 +1821,9 @@ dependencies = [ [[package]] name = "console" -version = "0.16.3" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" +checksum = "4fe5f465a4f6fee88fad41b85d990f84c835335e85b5d9e6e63e0d06d28cba7c" dependencies = [ "encode_unicode", "libc", @@ -1959,7 +1959,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.6.3", + "clap 4.6.4", "criterion-plot", "itertools 0.13.0", "num-traits", @@ -1992,18 +1992,18 @@ checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] name = "crossbeam-channel" -version = "0.5.15" +version = "0.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +checksum = "d85363c37faeca707aef026efa9f3b34d077bce547e48f770770625c6013679e" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -2011,18 +2011,18 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crossterm" @@ -2030,7 +2030,7 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "crossterm_winapi", "mio", "parking_lot", @@ -2047,7 +2047,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "crossterm_winapi", "derive_more", "document-features", @@ -2128,9 +2128,9 @@ dependencies = [ [[package]] name = "ctor" -version = "1.0.12" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d83cb7e7a873830708d6b02a78cd36a592c6fa14bf267b68725103b85c0d77f" +checksum = "e2e30e509674ef0ec91e21a7735766db37d163d46151b6a361d8b83dd79116bd" dependencies = [ "link-section", "linktime-proc-macro", @@ -2165,7 +2165,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -2176,7 +2176,7 @@ checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -2196,8 +2196,7 @@ dependencies = [ [[package]] name = "datafusion" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "754ef4e8f073922a26f5b23133b9db4829342362b09be0bc94309cf261c2f098" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-schema", @@ -2233,7 +2232,7 @@ dependencies = [ "flate2", "futures", "indexmap 2.14.0", - "itertools 0.14.0", + "itertools 0.15.0", "liblzma", "log", "object_store", @@ -2250,8 +2249,7 @@ dependencies = [ [[package]] name = "datafusion-catalog" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06afd1e38dd27bbb1258685a1fc6524df6aff4e07b25b393a47de59635178d99" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "async-trait", @@ -2265,7 +2263,7 @@ dependencies = [ "datafusion-physical-plan", "datafusion-session", "futures", - "itertools 0.14.0", + "itertools 0.15.0", "log", "object_store", "parking_lot", @@ -2275,8 +2273,7 @@ dependencies = [ [[package]] name = "datafusion-catalog-listing" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0668fb32c12065ec242be0e5b4bc62bd7a06a0be3ecd83791ef877e4be67e02" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "async-trait", @@ -2290,23 +2287,23 @@ dependencies = [ "datafusion-physical-expr-common", "datafusion-physical-plan", "futures", - "itertools 0.14.0", + "itertools 0.15.0", "log", "object_store", + "percent-encoding", ] [[package]] name = "datafusion-cli" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f652cbc0854d1e24c8038e2c7be53ef395768b8713fceaaa00789ae6134a5ee" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "async-trait", "aws-config", "aws-credential-types", "chrono", - "clap 4.6.3", + "clap 4.6.4", "datafusion", "datafusion-common", "dirs", @@ -2326,8 +2323,7 @@ dependencies = [ [[package]] name = "datafusion-common" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca43b263cdff57042cfa8fb817fb3469f4878933380dccff25f5e793580abbf9" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-ipc", @@ -2338,9 +2334,10 @@ dependencies = [ "hashbrown 0.17.1", "hex", "indexmap 2.14.0", - "itertools 0.14.0", + "itertools 0.15.0", "libc", "log", + "num-traits", "object_store", "parquet", "recursive", @@ -2353,8 +2350,7 @@ dependencies = [ [[package]] name = "datafusion-common-runtime" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f0ba2b864792bdca4d76c59a1de0ab6e1b61946596b9936888dbd6360035f2" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "futures", "log", @@ -2364,8 +2360,7 @@ dependencies = [ [[package]] name = "datafusion-datasource" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b840a8bce0bcbf5afad02946d438591e7c373f7afccaf3d874c04485772514dd" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "async-compression", @@ -2381,16 +2376,17 @@ dependencies = [ "datafusion-physical-expr-adapter", "datafusion-physical-expr-common", "datafusion-physical-plan", + "datafusion-proto-models", "datafusion-session", "flate2", "futures", "glob", - "itertools 0.14.0", + "itertools 0.15.0", "liblzma", "log", "object_store", "parking_lot", - "rand 0.9.4", + "rand 0.9.5", "tokio", "tokio-util", "url", @@ -2400,8 +2396,7 @@ dependencies = [ [[package]] name = "datafusion-datasource-arrow" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a24cc0b9cf6e367f27f27406eff13abf48a11b72446aaa40b3105c0ded5c17d9" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-ipc", @@ -2416,7 +2411,7 @@ dependencies = [ "datafusion-physical-plan", "datafusion-session", "futures", - "itertools 0.14.0", + "itertools 0.15.0", "object_store", "tokio", ] @@ -2424,8 +2419,7 @@ dependencies = [ [[package]] name = "datafusion-datasource-avro" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26a312bb06528c17b4bb86b798b0c4321e7656d85e0ef65c2e9adf07b0a518d" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-avro", @@ -2443,8 +2437,7 @@ dependencies = [ [[package]] name = "datafusion-datasource-csv" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1abe56b2a7a2d1d6de5117dd1a203181e267f28529faa5da546947621b697d7" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "async-trait", @@ -2456,6 +2449,7 @@ dependencies = [ "datafusion-expr", "datafusion-physical-expr-common", "datafusion-physical-plan", + "datafusion-proto-models", "datafusion-session", "futures", "object_store", @@ -2466,8 +2460,7 @@ dependencies = [ [[package]] name = "datafusion-datasource-json" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3e467f0611ad7bdd5aad17c63c9bb6182d04e5282e5496d897ea2b49c024ba" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "async-trait", @@ -2479,6 +2472,7 @@ dependencies = [ "datafusion-expr", "datafusion-physical-expr-common", "datafusion-physical-plan", + "datafusion-proto-models", "datafusion-session", "futures", "object_store", @@ -2489,10 +2483,10 @@ dependencies = [ [[package]] name = "datafusion-datasource-parquet" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cc35b92cd560082155e80d9c826929c852d3c51543f4affd3a51c464a0aab3a" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", + "arrow-schema", "async-trait", "bytes", "datafusion-common", @@ -2506,10 +2500,11 @@ dependencies = [ "datafusion-physical-expr-adapter", "datafusion-physical-expr-common", "datafusion-physical-plan", + "datafusion-proto-models", "datafusion-pruning", "datafusion-session", "futures", - "itertools 0.14.0", + "itertools 0.15.0", "log", "object_store", "parking_lot", @@ -2520,18 +2515,17 @@ dependencies = [ [[package]] name = "datafusion-doc" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d69bb69d8769e34f76839c960dbde24c1ac0c885a79b6c3c2287bdc56ec67891" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" [[package]] name = "datafusion-execution" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8eac0a09bc8d263f52025cad9e001da4d8138d633fa288edda4d06b1772eae6" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-buffer", "async-trait", + "bytes", "dashmap", "datafusion-common", "datafusion-expr", @@ -2541,16 +2535,18 @@ dependencies = [ "object_store", "parking_lot", "parquet", - "rand 0.9.4", + "pin-project-lite", + "rand 0.9.5", "tempfile", + "tokio", + "tokio-util", "url", ] [[package]] name = "datafusion-expr" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb14d374767ee0fc62dc79a5ba8bcf8a63c14e993c7d992d0e63adfa23d77d3" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-schema", @@ -2563,7 +2559,7 @@ dependencies = [ "datafusion-functions-window-common", "datafusion-physical-expr-common", "indexmap 2.14.0", - "itertools 0.14.0", + "itertools 0.15.0", "recursive", "serde_json", "sqlparser", @@ -2572,24 +2568,22 @@ dependencies = [ [[package]] name = "datafusion-expr-common" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7b19a8c95522bee8cbb313d74263b85e355d2b52f42e67ef5694bf5de9e9356" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", "indexmap 2.14.0", - "itertools 0.14.0", + "itertools 0.15.0", ] [[package]] name = "datafusion-functions" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f64c983bbbdcb729d921a2b2ac3375598719b5cc0c30345ad664936f3176fc7" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-buffer", - "base64", + "base64 0.23.1", "blake2", "blake3", "chrono", @@ -2602,12 +2596,12 @@ dependencies = [ "datafusion-macros", "datafusion-physical-expr-common", "hex", - "itertools 0.14.0", + "itertools 0.15.0", "log", "md-5 0.11.0", "memchr", "num-traits", - "rand 0.9.4", + "rand 0.9.5", "regex", "sha2 0.11.0", "uuid", @@ -2616,8 +2610,7 @@ dependencies = [ [[package]] name = "datafusion-functions-aggregate" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89bc17041e424a47ed062f43df24d84aab8b57c4c3221e5c1a5eef46d6c5718b" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", @@ -2628,8 +2621,8 @@ dependencies = [ "datafusion-macros", "datafusion-physical-expr", "datafusion-physical-expr-common", - "foldhash 0.2.0", "half", + "hashbrown 0.17.1", "log", "num-traits", ] @@ -2637,8 +2630,7 @@ dependencies = [ [[package]] name = "datafusion-functions-aggregate-common" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97dd2a9e865c6108059f5b37b77934f84b50bfb108f837bd0e5c9536e03f0545" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", @@ -2649,8 +2641,7 @@ dependencies = [ [[package]] name = "datafusion-functions-nested" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f0bdfeef16d96417b9632ef855645376b242e9006a126dfd0bedfc54a93f5f" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-ord", @@ -2665,7 +2656,7 @@ dependencies = [ "datafusion-macros", "datafusion-physical-expr-common", "hashbrown 0.17.1", - "itertools 0.14.0", + "itertools 0.15.0", "itoa", "log", "memchr", @@ -2674,8 +2665,7 @@ dependencies = [ [[package]] name = "datafusion-functions-table" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e4941673c917819616877e9993da4503e4f4739812be0bc32c5356184c6383" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "async-trait", @@ -2690,8 +2680,7 @@ dependencies = [ [[package]] name = "datafusion-functions-window" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dd2e16c12b84b6f6b41b19f55b366dd1c46876bb35b86896c6349067379e8d" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", @@ -2707,8 +2696,7 @@ dependencies = [ [[package]] name = "datafusion-functions-window-common" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cdc5e4b6f8b6ef823cc1c761f85088ad4c884fe8df64df3cbcc6b2b84698441" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "datafusion-common", "datafusion-physical-expr-common", @@ -2717,19 +2705,17 @@ dependencies = [ [[package]] name = "datafusion-macros" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a3614234dd93578c92428cb4f408e020874f0d2b7e6c90c928d9d28b5df2ceb" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "datafusion-doc", "quote", - "syn 2.0.117", + "syn 3.0.3", ] [[package]] name = "datafusion-optimizer" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0635620b050b81bb92764e99250868f654e2cd5ad1bece413283b3f73c83179" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "chrono", @@ -2738,7 +2724,7 @@ dependencies = [ "datafusion-expr-common", "datafusion-physical-expr", "indexmap 2.14.0", - "itertools 0.14.0", + "itertools 0.15.0", "log", "recursive", "regex", @@ -2748,8 +2734,7 @@ dependencies = [ [[package]] name = "datafusion-physical-expr" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cabf7a86eb70b816729e33c81bf7767c936ee1226f607a114f5dac2decac8d0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", @@ -2757,10 +2742,11 @@ dependencies = [ "datafusion-expr-common", "datafusion-functions-aggregate-common", "datafusion-physical-expr-common", + "datafusion-proto-models", "half", "hashbrown 0.17.1", "indexmap 2.14.0", - "itertools 0.14.0", + "itertools 0.15.0", "parking_lot", "petgraph", "recursive", @@ -2770,8 +2756,7 @@ dependencies = [ [[package]] name = "datafusion-physical-expr-adapter" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de222e04f7e6744501555a54ab0abe26bfdfebee380af79a9bdc175704246859" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", @@ -2779,22 +2764,22 @@ dependencies = [ "datafusion-functions", "datafusion-physical-expr", "datafusion-physical-expr-common", - "itertools 0.14.0", + "itertools 0.15.0", ] [[package]] name = "datafusion-physical-expr-common" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d0d0057fc5a502d45c870cb6d47c66eb7bdd5edb1bd71ad6f3f724975ac2a8" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "chrono", "datafusion-common", "datafusion-expr-common", + "datafusion-proto-models", "hashbrown 0.17.1", "indexmap 2.14.0", - "itertools 0.14.0", + "itertools 0.15.0", "parking_lot", "pin-project", ] @@ -2802,8 +2787,7 @@ dependencies = [ [[package]] name = "datafusion-physical-optimizer" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86046eed10950c5f9aaed9acfd148e9bd2e1dfdfe4f9aef607d1447b271e4183" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", @@ -2814,15 +2798,15 @@ dependencies = [ "datafusion-physical-expr-common", "datafusion-physical-plan", "datafusion-pruning", - "itertools 0.14.0", + "datafusion-session", + "itertools 0.15.0", "recursive", ] [[package]] name = "datafusion-physical-plan" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bc84da934c903407ba297971ebcc020c4c1a38aafd765d6c144c76eff3fa6a1" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-data", @@ -2830,6 +2814,7 @@ dependencies = [ "arrow-ord", "arrow-schema", "async-trait", + "bytes", "datafusion-common", "datafusion-common-runtime", "datafusion-execution", @@ -2839,23 +2824,25 @@ dependencies = [ "datafusion-functions-window-common", "datafusion-physical-expr", "datafusion-physical-expr-common", + "datafusion-proto-common", + "datafusion-proto-models", "futures", "half", "hashbrown 0.17.1", "indexmap 2.14.0", - "itertools 0.14.0", + "itertools 0.15.0", "log", "num-traits", "parking_lot", "pin-project-lite", + "serde_json", "tokio", ] [[package]] name = "datafusion-proto" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67791dcfacd142a9d95f8f73c2a161094cc936d231d80c235f5017dacf24e84e" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "chrono", @@ -2874,6 +2861,7 @@ dependencies = [ "datafusion-physical-expr-common", "datafusion-physical-plan", "datafusion-proto-common", + "datafusion-proto-models", "object_store", "prost", ] @@ -2881,19 +2869,26 @@ dependencies = [ [[package]] name = "datafusion-proto-common" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8cd9e80d637891645d074db0f6c650b591117367247deb313fdfb78dff559cb" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", "prost", ] +[[package]] +name = "datafusion-proto-models" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" +dependencies = [ + "datafusion-proto-common", + "prost", +] + [[package]] name = "datafusion-pruning" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb63eeac6de19be40f487b65dd84e546195f783c5a9928618e0c4f2a3569b0d7" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", @@ -2908,9 +2903,9 @@ dependencies = [ [[package]] name = "datafusion-session" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f961d209177f91bd014db5cbb2c33b7d28a2597b9003e77f17aeb712964315a" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ + "arrow-schema", "async-trait", "datafusion-common", "datafusion-execution", @@ -2922,8 +2917,7 @@ dependencies = [ [[package]] name = "datafusion-spark" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ccd16a6949503e56c084df1b90c8889db826ec9347d2f0f51a7837d6fa011e" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "bigdecimal", @@ -2941,7 +2935,7 @@ dependencies = [ "log", "num-traits", "percent-encoding", - "rand 0.9.4", + "rand 0.9.5", "serde_json", "sha1 0.11.0", "sha2 0.11.0", @@ -2952,8 +2946,7 @@ dependencies = [ [[package]] name = "datafusion-sql" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d71cb454da682b2af7488e1fc1ddd72ee1b28f19297b8ccad73f0a21ee9a69" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "bigdecimal", @@ -2966,20 +2959,20 @@ dependencies = [ "recursive", "regex", "sqlparser", + "stacker", ] [[package]] name = "datafusion-substrait" version = "54.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f047a6fbf967b6b523758a48d2377bb5f9373a20e7ae4c4326d3c569f80ba3d7" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "async-recursion", "async-trait", "chrono", "datafusion", "half", - "itertools 0.14.0", + "itertools 0.15.0", "object_store", "pbjson-types", "prost", @@ -2988,6 +2981,37 @@ dependencies = [ "url", ] +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.19", +] + [[package]] name = "deltae" version = "0.3.2" @@ -3000,7 +3024,6 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ - "powerfmt", "serde_core", ] @@ -3023,7 +3046,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -3078,7 +3101,7 @@ checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -3087,7 +3110,7 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29547a1dc60885a552306986316bc9701ba120c1a8db6769fa68691529ad373d" dependencies = [ - "base64", + "base64 0.22.1", "serde", "serde_json", ] @@ -3248,9 +3271,9 @@ checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" [[package]] name = "fastrand" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "ferroid" @@ -3274,16 +3297,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "filetime" -version = "0.2.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" -dependencies = [ - "cfg-if", - "libc", -] - [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -3314,7 +3327,7 @@ version = "25.12.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35f6839d7b3b98adde531effaf34f0c2badc6f4735d26fe74709d8e513a96ef3" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "rustc_version", ] @@ -3424,7 +3437,7 @@ checksum = "2d6d3cde68c518367be28956066ddfef33813991b77a55005a69dae04bf3b10b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -3499,25 +3512,23 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi 6.0.0", "rand_core 0.10.1", - "wasip2", - "wasip3", "wasm-bindgen", ] [[package]] name = "glob" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" [[package]] name = "gloo-timers" @@ -3555,22 +3566,22 @@ dependencies = [ "into-attr-derive", "pest", "pest_derive", - "rand 0.9.4", + "rand 0.9.5", "tempfile", ] [[package]] name = "h2" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.5.0", + "http 1.4.2", "indexmap 2.14.0", "slab", "tokio", @@ -3694,9 +3705,9 @@ dependencies = [ [[package]] name = "http" -version = "1.5.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" dependencies = [ "bytes", "itoa", @@ -3715,24 +3726,24 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", - "http 1.5.0", + "http 1.4.2", ] [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "e9f41fd6a08e4d4ec69df65976da761afd5ad5e58a9d4acb46bd1c953a9e3ff2" dependencies = [ "bytes", "futures-core", - "http 1.5.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "pin-project-lite", ] @@ -3750,32 +3761,32 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" +checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15" [[package]] name = "hybrid-array" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +checksum = "818356c5132c1fede50f837ca96afbe78ff42413047f4abb886217845e1b6c8c" dependencies = [ "typenum", ] [[package]] name = "hyper" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" dependencies = [ "atomic-waker", "bytes", "futures-channel", "futures-core", "h2", - "http 1.5.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "httparse", "httpdate", "itoa", @@ -3787,9 +3798,9 @@ dependencies = [ [[package]] name = "hyper-named-pipe" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b7d8abf35697b81a825e386fc151e0d503e8cb5fcb93cc8669c376dfd6f278" +checksum = "fab3637d6b04a8037af8a266fdf6cf92ea957e8c53981a2bf6136572531025bf" dependencies = [ "hex", "hyper", @@ -3797,7 +3808,6 @@ dependencies = [ "pin-project-lite", "tokio", "tower-service", - "winapi", ] [[package]] @@ -3806,7 +3816,7 @@ version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ - "http 1.5.0", + "http 1.4.2", "hyper", "hyper-util", "rustls", @@ -3835,12 +3845,12 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-channel", "futures-util", - "http 1.5.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "hyper", "ipnet", "libc", @@ -3975,12 +3985,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - [[package]] name = "ident_case" version = "1.0.1" @@ -4062,15 +4066,9 @@ dependencies = [ "indoc", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] -[[package]] -name = "integer-encoding" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" - [[package]] name = "into-attr" version = "0.1.1" @@ -4149,10 +4147,12 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jiff" -version = "0.2.28" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4603d3033e49e2b0e31229fcab20a5d40089c607d975cd9c80551dc69eed9102" +checksum = "e184d09547b80eb7e20d141ba2fb1fbac843ca53f4cf1b31210adc4c1adc6e16" dependencies = [ + "defmt", + "jiff-core", "jiff-static", "log", "portable-atomic", @@ -4160,15 +4160,25 @@ dependencies = [ "serde_core", ] +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", +] + [[package]] name = "jiff-static" -version = "0.2.28" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "782d32378dddf207193ac91cefb848ad41abb58195c95168e1291227a0832b47" +checksum = "323da076b7a6faf914dc677cb05a4b907742ff7375c8322c9e7f5061e5e0e9de" dependencies = [ + "jiff-core", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -4183,7 +4193,7 @@ dependencies = [ "jni-sys", "log", "simd_cesu8", - "thiserror 2.0.18", + "thiserror 2.0.19", "walkdir", "windows-link", ] @@ -4198,7 +4208,7 @@ dependencies = [ "quote", "rustc_version", "simd_cesu8", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -4217,24 +4227,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "jobserver" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.100" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2025f20d7a4fa7785846e7b63d10a76d3f1cee98ee5cb79ea59703f95e42162" +checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102" dependencies = [ "cfg-if", "futures-util", @@ -4249,7 +4259,7 @@ checksum = "bde5057d6143cc94e861d90f591b9303d6716c6b9602309150bd068853c10899" dependencies = [ "hashbrown 0.16.1", "portable-atomic", - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] @@ -4264,12 +4274,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - [[package]] name = "lexical-core" version = "1.0.6" @@ -4341,18 +4345,18 @@ checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "liblzma" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6033b77c21d1f56deeae8014eb9fbe7bdf1765185a6c508b5ca82eeaed7f899" +checksum = "45aec2360b3933207e27908049d8e4df4e476b58180afb1e56b2a4fb72efe4ba" dependencies = [ "liblzma-sys", ] [[package]] name = "liblzma-sys" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a60851d15cd8c5346eca4ab8babff585be2ae4bc8097c067291d3ffe2add3b6" +checksum = "a046c7f353ba30f810545151e04f63545833803f5b86ee3ddf1517247fe560a5" dependencies = [ "cc", "libc", @@ -4376,9 +4380,9 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" dependencies = [ "libc", ] @@ -4389,20 +4393,20 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f50e8f47623268b5407192d26876c4d7f89d686ca130fdc53bced4814cd29f8" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", ] [[package]] name = "link-section" -version = "0.19.2" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee1a0d6e252afe82e7bc2db42fba60e02ddf3b1accaf8cb21d96e34ba61f3d4" +checksum = "8dc98458dfe90986c5e2f6ddcf68360c7e5c4252600153e06aa4ee8176c0f8d1" [[package]] name = "linktime-proc-macro" -version = "0.2.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348d0075b1fc163b26d72a7f75fc5141daf2fd1bdf128d873cbaf6785d495bdf" +checksum = "8c7b0a3383c2a1002d11349c92c85a666a5fb679e96c79d782cf0dbe557fd6ee" [[package]] name = "linux-raw-sys" @@ -4469,9 +4473,9 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "lz4_flex" -version = "0.13.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef0d4ed8669f8f8826eb00dc878084aa8f253506c4fd5e8f58f5bce72ddb97e" +checksum = "ecbdfe44b1bd960b68170b417450a628c43f7cf56bb3c5317e61cb230ee7f226" dependencies = [ "twox-hash", ] @@ -4523,9 +4527,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.2" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "memmem" @@ -4594,9 +4598,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" dependencies = [ "libc", "log", @@ -4625,7 +4629,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "cfg-if", "cfg_aliases", "libc", @@ -4638,7 +4642,7 @@ version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "cfg-if", "cfg_aliases", "libc", @@ -4678,7 +4682,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", "num-complex", "num-integer", "num-iter", @@ -4688,9 +4692,19 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0" dependencies = [ "num-integer", "num-traits", @@ -4719,7 +4733,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -4733,11 +4747,10 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -4748,7 +4761,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", "num-integer", "num-traits", ] @@ -4784,7 +4797,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", ] [[package]] @@ -4813,14 +4826,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622acbc9100d3c10e2ee15804b0caa40e55c933d5aa53814cd520805b7958a49" dependencies = [ "async-trait", - "base64", + "base64 0.22.1", "bytes", "chrono", "form_urlencoded", "futures-channel", "futures-core", "futures-util", - "http 1.5.0", + "http 1.4.2", "http-body-util", "humantime", "hyper", @@ -4836,7 +4849,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", "tracing", "url", @@ -4875,15 +4888,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" -[[package]] -name = "ordered-float" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" -dependencies = [ - "num-traits", -] - [[package]] name = "ordered-float" version = "4.6.0" @@ -4930,7 +4934,7 @@ dependencies = [ "by_address", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -4958,9 +4962,9 @@ dependencies = [ [[package]] name = "parquet" -version = "58.3.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dafa7d01085b62a47dd0c1829550a0a36710ea9c4fe358a05a85477cec8a908" +checksum = "7065842956a20c2a536924ce8e4d9955f7422451511b9eb7500d7bfe5077e59c" dependencies = [ "ahash", "arrow-array", @@ -4969,7 +4973,7 @@ dependencies = [ "arrow-ipc", "arrow-schema", "arrow-select", - "base64", + "base64 0.23.1", "brotli", "bytes", "chrono", @@ -4978,16 +4982,14 @@ dependencies = [ "half", "hashbrown 0.17.1", "lz4_flex", - "num-bigint", + "num-bigint 0.5.1", "num-integer", "num-traits", "object_store", - "paste", "ring", "seq-macro", "simdutf8", "snap", - "thrift", "tokio", "twox-hash", "zstd", @@ -5015,15 +5017,9 @@ dependencies = [ "regex", "regex-syntax", "structmeta", - "syn 2.0.117", + "syn 2.0.119", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "pathdiff" version = "0.2.3" @@ -5036,7 +5032,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "898bac3fa00d0ba57a4e8289837e965baa2dee8c3749f3b11d45a64b4223d9c3" dependencies = [ - "base64", + "base64 0.22.1", "serde", ] @@ -5075,9 +5071,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.6" +version = "2.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" +checksum = "7df728be843c7070fab6ab7c328c4e9e9d78e23bf749c0669c86ee7ebfa050a2" dependencies = [ "memchr", "ucd-trie", @@ -5085,9 +5081,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.6" +version = "2.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" +checksum = "9e2dd6fc3b26b3462ee188aac870f5a41d398f1cd5e2408d16531bd71c9591fd" dependencies = [ "pest", "pest_generator", @@ -5095,25 +5091,24 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.6" +version = "2.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" +checksum = "6a7a9205cfb6f596a9e8b689c0a15f9ceb7a1aafae7aaf788150ac65b29975b6" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "pest_meta" -version = "2.8.6" +version = "2.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" +checksum = "85abd351c0de1e8384fc791a0737111a350394937e92b956b743dac12429f57c" dependencies = [ "pest", - "sha2 0.10.9", ] [[package]] @@ -5164,7 +5159,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared 0.11.3", - "rand 0.8.6", + "rand 0.8.7", ] [[package]] @@ -5177,7 +5172,7 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -5215,7 +5210,7 @@ checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -5266,9 +5261,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" [[package]] name = "portable-atomic-util" @@ -5310,7 +5305,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -5348,9 +5343,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] @@ -5361,7 +5356,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "hex", "procfs-core", "rustix 0.38.44", @@ -5373,7 +5368,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "hex", ] @@ -5391,7 +5386,7 @@ dependencies = [ "parking_lot", "procfs", "protobuf", - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] @@ -5433,7 +5428,7 @@ dependencies = [ "pulldown-cmark", "pulldown-cmark-to-cmark", "regex", - "syn 2.0.117", + "syn 2.0.119", "tempfile", ] @@ -5447,7 +5442,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -5495,7 +5490,7 @@ version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9f068eba8e7071c5f9511831b44f32c740d5adf574e990f946ddb53db2f314e" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "memchr", "unicase", ] @@ -5521,9 +5516,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", "cfg_aliases", @@ -5533,7 +5528,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", "tracing", "web-time", @@ -5547,7 +5542,7 @@ checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560" dependencies = [ "aws-lc-rs", "bytes", - "getrandom 0.4.2", + "getrandom 0.4.3", "lru-slab", "rand 0.10.2", "rand_pcg", @@ -5556,7 +5551,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.18", + "thiserror 2.0.19", "tinyvec", "tracing", "web-time", @@ -5564,23 +5559,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "quote" -version = "1.0.45" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -5615,18 +5610,18 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +checksum = "22f6172bdec972074665ed81ed53b71da00bfc44b65a753cfde883ec4c702a1a" dependencies = [ "rand_core 0.6.4", ] [[package]] name = "rand" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" dependencies = [ "rand_chacha", "rand_core 0.9.5", @@ -5639,7 +5634,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ "chacha20", - "getrandom 0.4.2", + "getrandom 0.4.3", "rand_core 0.10.1", ] @@ -5706,7 +5701,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cbb175c433c8e28a809d1f5773a2ae96e68c0ce40db865cbab1020bf33ae479c" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "compact_str", "critical-section", "hashbrown 0.17.1", @@ -5716,7 +5711,7 @@ dependencies = [ "palette", "serde", "strum", - "thiserror 2.0.18", + "thiserror 2.0.19", "unicode-segmentation", "unicode-truncate", "unicode-width 0.2.2", @@ -5783,7 +5778,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66e3d19bcc9130ca376277d93b60767ff121ace3be06f5f95f81dd68956407d1" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "hashbrown 0.17.1", "indoc", "instability", @@ -5808,7 +5803,7 @@ dependencies = [ "compact_str", "console_error_panic_hook", "ratatui", - "thiserror 2.0.18", + "thiserror 2.0.19", "unicode-width 0.2.2", "web-sys", ] @@ -5850,7 +5845,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76009fbe0614077fc1a2ce255e3a1881a2e3a3527097d5dc6d8212c585e7e38b" dependencies = [ "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -5859,7 +5854,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", ] [[package]] @@ -5870,27 +5865,27 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.17", "libredox", - "thiserror 2.0.18", + "thiserror 2.0.19", ] [[package]] name = "ref-cast" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +checksum = "216e8f773d7923bcba9ceb86a86c93cabb3903a11872fc3f138c49630e50b96d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +checksum = "2c9283685feec7d69af75fb0e858d5e7378f33fe4fc699383b2916ab9273e03c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.3", ] [[package]] @@ -5950,13 +5945,13 @@ version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-core", "futures-util", "h2", - "http 1.5.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "http-body-util", "hyper", "hyper-rustls", @@ -5992,13 +5987,13 @@ version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "encoding_rs", "futures-core", "h2", - "http 1.5.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "http-body-util", "hyper", "hyper-rustls", @@ -6065,15 +6060,15 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.117", + "syn 2.0.119", "unicode-ident", ] [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc-std-workspace-core" @@ -6096,7 +6091,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys 0.4.15", @@ -6109,7 +6104,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys 0.12.1", @@ -6118,9 +6113,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.43" +version = "0.23.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" +checksum = "3c54fcab019b409d04215d3a17cb438fd7fbf192ee61461f20f4fe18704bc138" dependencies = [ "aws-lc-rs", "log", @@ -6146,9 +6141,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.1" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" dependencies = [ "web-time", "zeroize", @@ -6195,9 +6190,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "rustyline" @@ -6205,7 +6200,7 @@ version = "18.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53f6a737db68eb1a8ccff86b584b2fc13eca6a7bb6f78ebc7c529547e3ab9684" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "cfg-if", "clipboard-win", "home", @@ -6289,7 +6284,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -6304,7 +6299,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -6364,7 +6359,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.1", + "syn 3.0.3", ] [[package]] @@ -6375,7 +6370,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -6405,13 +6400,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.3", ] [[package]] @@ -6423,7 +6418,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -6444,7 +6439,7 @@ version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" dependencies = [ - "base64", + "base64 0.22.1", "bs58", "chrono", "hex", @@ -6467,7 +6462,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -6485,9 +6480,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" dependencies = [ "cfg-if", "cpufeatures 0.2.17", @@ -6575,15 +6570,15 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" [[package]] name = "simd_cesu8" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" dependencies = [ "rustc_version", "simdutf8", @@ -6630,15 +6625,15 @@ checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" [[package]] name = "snap" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" +checksum = "199905e6153d6405f9728fe44daace35f8f837bbf830bb6e85fbd5828709a886" [[package]] name = "socket2" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", "windows-sys 0.61.2", @@ -6663,7 +6658,7 @@ checksum = "a6dd45d8fc1c79299bfbb7190e42ccbbdf6a5f52e4a6ad98d92357ea965bd289" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -6706,7 +6701,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -6717,7 +6712,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -6762,7 +6757,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -6786,7 +6781,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml", - "syn 2.0.117", + "syn 2.0.119", "typify", "walkdir", ] @@ -6816,9 +6811,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.117" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" dependencies = [ "proc-macro2", "quote", @@ -6827,9 +6822,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.1" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5edbec4ed188954a10c12c038215f8ce7606b2d5c973cd8dc43e8795065c5f2f" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" dependencies = [ "proc-macro2", "quote", @@ -6853,7 +6848,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -6876,7 +6871,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -6904,7 +6899,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.2", + "getrandom 0.4.3", "once_cell", "rustix 1.1.4", "windows-sys 0.61.2", @@ -6916,7 +6911,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9048a889effe34a5cddee0af7f53285198b16dca3be510858d38dfdb3e62a04e" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "parking_lot", "rustix 1.1.4", "signal-hook", @@ -6962,8 +6957,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4676b37242ccbd1aabf56edb093a4827dc49086c0ffd764a5705899e0f35f8f7" dependencies = [ "anyhow", - "base64", - "bitflags 2.13.0", + "base64 0.22.1", + "bitflags 2.13.1", "fancy-regex", "filedescriptor", "finl_unicode", @@ -6976,7 +6971,7 @@ dependencies = [ "nix 0.29.0", "num-derive", "num-traits", - "ordered-float 4.6.0", + "ordered-float", "pest", "pest_derive", "phf 0.11.3", @@ -7013,7 +7008,7 @@ dependencies = [ "etcetera", "ferroid", "futures", - "http 1.5.0", + "http 1.4.2", "itertools 0.14.0", "log", "memchr", @@ -7022,7 +7017,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.18", + "thiserror 2.0.19", "tokio", "tokio-stream", "tokio-util", @@ -7058,11 +7053,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9" dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl 2.0.19", ] [[package]] @@ -7073,48 +7068,36 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.3", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] -[[package]] -name = "thrift" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09" -dependencies = [ - "byteorder", - "integer-encoding", - "ordered-float 2.10.1", -] - [[package]] name = "time" -version = "0.3.47" +version = "0.3.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +checksum = "3e1d5e639ff6bab73cb6885cc7e7b1de96c3f32c68ec55f3952614bec1092244" dependencies = [ "deranged", - "itoa", "libc", "num-conv", "num_threads", @@ -7126,15 +7109,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.27" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" dependencies = [ "num-conv", "time-core", @@ -7171,9 +7154,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" dependencies = [ "tinyvec_macros", ] @@ -7203,13 +7186,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" +checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -7259,9 +7242,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.12+spec-1.1.0" +version = "0.25.13+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ "indexmap 2.14.0", "toml_datetime", @@ -7286,11 +7269,11 @@ checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef" dependencies = [ "async-trait", "axum", - "base64", + "base64 0.22.1", "bytes", "h2", - "http 1.5.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "http-body-util", "hyper", "hyper-timeout", @@ -7317,7 +7300,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -7342,7 +7325,7 @@ dependencies = [ "prost-build", "prost-types", "quote", - "syn 2.0.117", + "syn 2.0.119", "tempfile", "tonic-build", ] @@ -7372,11 +7355,11 @@ version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "bytes", "futures-util", - "http 1.5.0", - "http-body 1.0.1", + "http 1.4.2", + "http-body 1.1.0", "pin-project-lite", "tower", "tower-layer", @@ -7390,9 +7373,9 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b11f75e912b0c2be01b63d8cf8057b8c3f97cf34abb3d431a3a4c8675498e233" dependencies = [ - "bitflags 2.13.0", + "bitflags 2.13.1", "bytes", - "http 1.5.0", + "http 1.4.2", "percent-encoding", "pin-project-lite", "tower-layer", @@ -7431,7 +7414,7 @@ checksum = "050686193eb999b4bb3bc2acfa891a13da00f79734704c4b8b4ef1a10b368a3c" dependencies = [ "crossbeam-channel", "symlink", - "thiserror 2.0.18", + "thiserror 2.0.19", "time", "tracing-subscriber", ] @@ -7444,7 +7427,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -7517,11 +7500,11 @@ dependencies = [ [[package]] name = "twox-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" +checksum = "8464ec13c3691491391d9fce00f6416c9a48e46972f72d7865688be2080192c9" dependencies = [ - "rand 0.9.4", + "rand 0.10.2", ] [[package]] @@ -7555,8 +7538,8 @@ dependencies = [ "semver", "serde", "serde_json", - "syn 2.0.117", - "thiserror 2.0.18", + "syn 2.0.119", + "thiserror 2.0.19", "unicode-ident", ] @@ -7573,7 +7556,7 @@ dependencies = [ "serde", "serde_json", "serde_tokenstream", - "syn 2.0.117", + "syn 2.0.119", "typify-impl", ] @@ -7627,12 +7610,6 @@ dependencies = [ "rustc-std-workspace-core", ] -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "unsafe-libyaml" version = "0.2.11" @@ -7651,7 +7628,7 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" dependencies = [ - "base64", + "base64 0.22.1", "log", "percent-encoding", "rustls", @@ -7666,8 +7643,8 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" dependencies = [ - "base64", - "http 1.5.0", + "base64 0.22.1", + "http 1.4.2", "httparse", "log", ] @@ -7725,7 +7702,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239" dependencies = [ "atomic", - "getrandom 0.4.2", + "getrandom 0.4.3", "js-sys", "serde_core", "wasm-bindgen", @@ -7785,27 +7762,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.3+wasi-0.2.9" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ - "wit-bindgen 0.57.1", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen 0.51.0", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.123" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a254a4b10c19a76f09a27640e7ffbf9bc30bf67e16a3bf28aaefa4920fe81563" +checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4" dependencies = [ "cfg-if", "once_cell", @@ -7816,9 +7784,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.73" +version = "0.4.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54568702fabf5d4849ce2b90fadfa64168a097eaf4b351ce9df8b687a0086aaf" +checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d" dependencies = [ "js-sys", "wasm-bindgen", @@ -7826,9 +7794,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.123" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a40fc75b0ec6f3746ceb10d36f53a93dcd68a93b11b6445983945d79eba0dc" +checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7836,48 +7804,26 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.123" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "908f34bd9b9ce3d4caf07b72dfab63d61504d156856c6bd3cd87fa350cf3985b" +checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.123" +version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7acbf7616c27b194bbb550bf77ed0c2c3e5b7fd1260a93082b95fb7f47959b92" +checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24" dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap 2.14.0", - "wasm-encoder", - "wasmparser", -] - [[package]] name = "wasm-streams" version = "0.4.2" @@ -7891,23 +7837,11 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags 2.13.0", - "hashbrown 0.15.5", - "indexmap 2.14.0", - "semver", -] - [[package]] name = "web-sys" -version = "0.3.100" +version = "0.3.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0871acf327f283dc6da28a1696cdc64fb355ba9f935d052021fa77f35cce69" +checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141" dependencies = [ "js-sys", "wasm-bindgen", @@ -7925,9 +7859,9 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31141ce3fc3e300ae89b78c0dd67f9708061d1d2eda54b8209346fd6be9a92c" +checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b" dependencies = [ "rustls-pki-types", ] @@ -7976,7 +7910,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f2ab60e120fd6eaa68d9567f3226e876684639d22a4219b313ff69ec0ccd5ac" dependencies = [ "log", - "ordered-float 4.6.0", + "ordered-float", "strsim", "thiserror 1.0.69", "wezterm-dynamic-derive", @@ -8090,7 +8024,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -8101,7 +8035,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -8251,107 +8185,19 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" dependencies = [ "memchr", ] -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - [[package]] name = "wit-bindgen" version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck 0.5.0", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck 0.5.0", - "indexmap 2.14.0", - "prettyplease", - "syn 2.0.117", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.117", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags 2.13.0", - "indexmap 2.14.0", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap 2.14.0", - "log", - "semver", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] - [[package]] name = "writeable" version = "0.6.3" @@ -8413,28 +8259,28 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.52" +version = "0.8.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.52" +version = "0.8.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -8454,15 +8300,15 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" [[package]] name = "zerotrie" @@ -8494,20 +8340,20 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "zlib-rs" -version = "0.6.3" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" +checksum = "b142a20ec14a91d5bc708c1dc21b080c550113d8aa77afa29635673a65dd02c5" [[package]] name = "zmij" -version = "1.0.21" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" [[package]] name = "zstd" diff --git a/Cargo.toml b/Cargo.toml index 5a6b966dd8..b8ab443a5e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,21 +35,20 @@ edition = "2024" rust-version = "1.88.0" [workspace.dependencies] -arrow = { version = "58.4", features = ["ipc_compression"] } -arrow-flight = { version = "58.4", features = ["flight-sql-experimental"] } +arrow = { version = "59.2.0", features = ["ipc_compression"] } +arrow-flight = { version = "59.2.0", features = ["flight-sql-experimental"] } clap = { version = "4.5", features = ["derive", "cargo"] } -# Keep these as minor-version requirements rather than exact patch pins. The -# python workspace shares these crates through path dependencies, and -# datafusion-python lags behind datafusion patch releases, so pinning a patch -# here can break the wheel build. Cargo.lock records the exact patch version. -datafusion = "54" -datafusion-cli = "54" -datafusion-functions-aggregate-common = "54" -datafusion-proto = "54" -datafusion-proto-common = "54" -datafusion-spark = "54" -datafusion-substrait = "54" +# DataFusion crates are pinned to a git rev of apache/datafusion main rather than +# a crates.io release. Bump this rev to advance to newer DataFusion commits. +datafusion = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-cli = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-ffi = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-functions-aggregate-common = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-proto = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-proto-common = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-spark = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-substrait = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } ctor = { version = "1.0" } insta = "1.47" diff --git a/ballista/client/tests/context_checks.rs b/ballista/client/tests/context_checks.rs index 5d9cf83ea5..af34e74769 100644 --- a/ballista/client/tests/context_checks.rs +++ b/ballista/client/tests/context_checks.rs @@ -1180,23 +1180,23 @@ mod supported { )?; let expected = [ - "+-------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+", - "| plan_type | plan |", - "+-------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+", - "| Plan with Metrics | =========SuccessfulStage[stage_id=1, partitions=1]========= |", - "| | SortShuffleWriterExec: partitioning=Hash([id@0], 16), metrics=[output_rows=..., input_rows=..., spill_bytes=..., spill_count=..., repart_time=..., spill_time=..., write_time=...] |", - "| | AggregateExec: mode=Partial, gby=[id@0 as id], aggr=[count(Int64(1))], metrics=[output_rows=..., elapsed_compute=..., output_bytes=..., output_batches=..., spill_count=..., spilled_bytes=..., spilled_rows=..., skipped_aggregation_rows=..., peak_mem_used=..., aggregate_arguments_time=..., aggregation_time=..., emitting_time=..., time_calculating_group_ids=..., reduction_factor=...] |", - "| | ProjectionExec: expr=[__unnest_placeholder(make_array(Int64(1),Int64(2),Int64(3),Int64(4),Int64(5)),depth=1)@0 as id], metrics=[output_rows=..., elapsed_compute=..., output_bytes=..., output_batches=..., expr_0_eval_time=...] |", - "| | UnnestExec, metrics=[output_rows=..., elapsed_compute=..., output_bytes=..., output_batches=..., input_batches=..., input_rows=...] |", - "| | ProjectionExec: expr=[[1, 2, 3, 4, 5] as __unnest_placeholder(make_array(Int64(1),Int64(2),Int64(3),Int64(4),Int64(5)))], metrics=[output_rows=..., elapsed_compute=..., output_bytes=..., output_batches=..., expr_0_eval_time=...] |", - "| | PlaceholderRowExec, metrics=[...] |", - "| | |", - "| | =========SuccessfulStage[stage_id=2, partitions=16]========= |", - "| | ShuffleWriterExec: partitioning: None, metrics=[output_rows=..., input_rows=..., write_time=...] |", - "| | ProjectionExec: expr=[count(Int64(1))@1 as count(*), id@0 as id], metrics=[output_rows=..., elapsed_compute=..., output_bytes=..., output_batches=..., expr_0_eval_time=..., expr_1_eval_time=...] |", - "| | AggregateExec: mode=FinalPartitioned, gby=[id@0 as id], aggr=[count(Int64(1))], metrics=[output_rows=..., elapsed_compute=..., output_bytes=..., output_batches=..., spill_count=..., spilled_bytes=..., spilled_rows=..., peak_mem_used=..., aggregate_arguments_time=..., aggregation_time=..., emitting_time=..., time_calculating_group_ids=...] |", - "| | ShuffleReaderExec: upstream_stage: 1, partitioning: Hash([id@0], 16), metrics=[output_rows=..., elapsed_compute=..., output_bytes=..., output_batches=..., decoded_bytes=..., fetch_requests=..., fetch_retries=..., local_partitions=..., remote_partitions=..., fetch_time=..., local_read_time=..., permit_wait_time=...] |", - "+-------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+", + "+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+", + "| plan_type | plan |", + "+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+", + "| Plan with Metrics | =========SuccessfulStage[stage_id=1, partitions=1]========= |", + "| | SortShuffleWriterExec: partitioning=Hash([id@0], 16), metrics=[output_rows=..., input_rows=..., spill_bytes=..., spill_count=..., repart_time=..., spill_time=..., write_time=...] |", + "| | AggregateExec: mode=Partial, gby=[id@0 as id], aggr=[count(Int64(1))], metrics=[output_rows=..., elapsed_compute=..., output_bytes=..., output_batches=..., spill_count=..., spilled_bytes=..., spilled_rows=..., skipped_aggregation_rows=..., aggregate_arguments_time=..., aggregation_time=..., emitting_time=..., time_calculating_group_ids=..., reduction_factor=...] |", + "| | ProjectionExec: expr=[__unnest_placeholder(make_array(Int64(1),Int64(2),Int64(3),Int64(4),Int64(5)),depth=1)@0 as id], metrics=[output_rows=..., elapsed_compute=..., output_bytes=..., output_batches=..., expr_0_eval_time=...] |", + "| | UnnestExec, metrics=[output_rows=..., elapsed_compute=..., output_bytes=..., output_batches=..., input_batches=..., input_rows=...] |", + "| | ProjectionExec: expr=[[1, 2, 3, 4, 5] as __unnest_placeholder(make_array(Int64(1),Int64(2),Int64(3),Int64(4),Int64(5)))], metrics=[output_rows=..., elapsed_compute=..., output_bytes=..., output_batches=..., expr_0_eval_time=...] |", + "| | PlaceholderRowExec, metrics=[...] |", + "| | |", + "| | =========SuccessfulStage[stage_id=2, partitions=16]========= |", + "| | ShuffleWriterExec: partitioning: None, metrics=[output_rows=..., input_rows=..., write_time=...] |", + "| | ProjectionExec: expr=[count(Int64(1))@1 as count(*), id@0 as id], metrics=[output_rows=..., elapsed_compute=..., output_bytes=..., output_batches=..., expr_0_eval_time=..., expr_1_eval_time=...] |", + "| | AggregateExec: mode=FinalPartitioned, gby=[id@0 as id], aggr=[count(Int64(1))], metrics=[output_rows=..., elapsed_compute=..., output_bytes=..., output_batches=..., spill_count=..., spilled_bytes=..., spilled_rows=..., aggregate_arguments_time=..., aggregation_time=..., emitting_time=..., time_calculating_group_ids=...] |", + "| | ShuffleReaderExec: upstream_stage: 1, partitioning: Hash([id@0], 16), metrics=[output_rows=..., elapsed_compute=..., output_bytes=..., output_batches=..., decoded_bytes=..., fetch_requests=..., fetch_retries=..., local_partitions=..., remote_partitions=..., fetch_time=..., local_read_time=..., permit_wait_time=...] |", + "+-------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+", ]; assert_batches_eq!(expected, &[sanitized]); diff --git a/ballista/client/tests/context_setup.rs b/ballista/client/tests/context_setup.rs index df999c06e4..d6700c74c5 100644 --- a/ballista/client/tests/context_setup.rs +++ b/ballista/client/tests/context_setup.rs @@ -109,16 +109,16 @@ mod standalone { use ballista_core::serde::BallistaPhysicalExtensionCodec; use datafusion::{ assert_batches_eq, + catalog::Session, common::exec_err, - execution::{ - SessionState, SessionStateBuilder, TaskContext, context::QueryPlanner, - }, + execution::{SessionStateBuilder, TaskContext, context::QueryPlanner}, logical_expr::LogicalPlan, physical_plan::ExecutionPlan, prelude::{SessionConfig, SessionContext}, }; use datafusion_proto::{ - logical_plan::LogicalExtensionCodec, physical_plan::PhysicalExtensionCodec, + logical_plan::LogicalExtensionCodec, + physical_plan::{PhysicalExtensionCodec, PhysicalProtoConverterExtension}, }; #[tokio::test] @@ -299,7 +299,7 @@ mod standalone { fn try_decode_table_provider( &self, _buf: &[u8], - _table_ref: &datafusion::sql::TableReference, + _table_ref: &datafusion::common::TableReference, _schema: datafusion::arrow::datatypes::SchemaRef, _ctx: &TaskContext, ) -> datafusion::error::Result< @@ -312,7 +312,7 @@ mod standalone { fn try_encode_table_provider( &self, - _table_ref: &datafusion::sql::TableReference, + _table_ref: &datafusion::common::TableReference, _node: std::sync::Arc, _buf: &mut Vec, ) -> datafusion::error::Result<()> { @@ -366,21 +366,23 @@ mod standalone { buf: &[u8], inputs: &[Arc], ctx: &TaskContext, + proto_converter: &dyn PhysicalProtoConverterExtension, ) -> datafusion::error::Result> { self.invoked .store(true, std::sync::atomic::Ordering::Relaxed); - self.codec.try_decode(buf, inputs, ctx) + self.codec.try_decode(buf, inputs, ctx, proto_converter) } fn try_encode( &self, node: Arc, buf: &mut Vec, + proto_converter: &dyn PhysicalProtoConverterExtension, ) -> datafusion::error::Result<()> { self.invoked .store(true, std::sync::atomic::Ordering::Relaxed); - self.codec.try_encode(node, buf) + self.codec.try_encode(node, buf, proto_converter) } } @@ -392,7 +394,7 @@ mod standalone { async fn create_physical_plan( &self, _logical_plan: &LogicalPlan, - _session_state: &SessionState, + _session_state: &dyn Session, ) -> datafusion::error::Result> { exec_err!("does not work") } diff --git a/ballista/core/proto/ballista.proto b/ballista/core/proto/ballista.proto index 99fceb91ea..08f540e21e 100644 --- a/ballista/core/proto/ballista.proto +++ b/ballista/core/proto/ballista.proto @@ -56,9 +56,17 @@ message BallistaPhysicalPlanNode { UnorderedRangeRepartitionExecNode unordered_range_repartition = 8; OrderedRangeRepartitionExecNode ordered_range_repartition = 9; PerPartitionFilterExecNode per_partition_filter = 10; + DistributedQueryExecNode distributed_query = 11; } } +message DistributedQueryExecNode { + string scheduler_url = 1; + repeated KeyValuePair settings = 2; + bytes logical_plan = 3; + string session_id = 4; +} + // Value-range router over N locally-sorted overlapping input partitions. // Redistributes them into K range-disjoint output partitions where each // output is fully sorted on the routing expression. Uses N × K scatter diff --git a/ballista/core/proto/datafusion_common.proto b/ballista/core/proto/datafusion_common.proto index dd3588d134..27d1101036 100644 --- a/ballista/core/proto/datafusion_common.proto +++ b/ballista/core/proto/datafusion_common.proto @@ -617,6 +617,8 @@ message ParquetOptions { uint64 max_row_group_size = 15; + uint64 max_in_list_size = 38; + string created_by = 16; oneof coerce_int96_opt { @@ -627,6 +629,10 @@ message ParquetOptions { uint64 max_predicate_cache_size = 33; } + oneof max_row_group_bytes_opt { + uint64 max_row_group_bytes = 37; + } + ParquetCdcOptions content_defined_chunking = 35; // Optional timezone applied to INT96-coerced timestamps when `coerce_int96` @@ -685,4 +691,30 @@ enum ExplainFormat { EXPLAIN_FORMAT_TREE = 1; EXPLAIN_FORMAT_PGJSON = 2; EXPLAIN_FORMAT_GRAPHVIZ = 3; +} + +// Verbosity level for `EXPLAIN ANALYZE`. Mirrors +// `datafusion_common::format::MetricType`. +enum MetricType { + METRIC_TYPE_SUMMARY = 0; + METRIC_TYPE_DEV = 1; +} + +// Category of an `EXPLAIN ANALYZE` metric. Mirrors +// `datafusion_common::format::MetricCategory`. +enum MetricCategory { + METRIC_CATEGORY_ROWS = 0; + METRIC_CATEGORY_BYTES = 1; + METRIC_CATEGORY_TIMING = 2; + METRIC_CATEGORY_UNCATEGORIZED = 3; +} + +// Wire encoding for `datafusion_common::format::ExplainAnalyzeCategories`. +// +// If `all` is true, every category is shown (the `only` list is ignored). +// If `all` is false, only the categories listed in `only` are shown — an +// empty `only` means "plan only", i.e. suppress all metrics. +message ExplainAnalyzeCategoriesNode { + bool all = 1; + repeated MetricCategory only = 2; } \ No newline at end of file diff --git a/ballista/core/src/execution_plans/buffer.rs b/ballista/core/src/execution_plans/buffer.rs index ae1a685177..515bdfbd97 100644 --- a/ballista/core/src/execution_plans/buffer.rs +++ b/ballista/core/src/execution_plans/buffer.rs @@ -83,7 +83,7 @@ use datafusion::physical_plan::execution_plan::CardinalityEffect; use datafusion::physical_plan::stream::RecordBatchStreamAdapter; use datafusion::physical_plan::{ DisplayAs, DisplayFormatType, ExecutionPlan, ExecutionPlanProperties, PlanProperties, - SendableRecordBatchStream, + SendableRecordBatchStream, StatisticsArgs, statistics::ChildStats, }; use futures::stream::{Stream, StreamExt, TryStreamExt}; @@ -238,8 +238,16 @@ impl ExecutionPlan for BufferExec { } /// Row count and per-column stats pass through unchanged. - fn partition_statistics(&self, partition: Option) -> Result> { - self.input.partition_statistics(partition) + fn statistics_from_inputs( + &self, + input_stats: &[Arc], + _args: &StatisticsArgs, + ) -> Result> { + Ok(Arc::clone(&input_stats[0])) + } + + fn child_stats_requests(&self, partition: Option) -> Vec { + vec![ChildStats::At(partition)] } /// Every input row is emitted exactly once. Overrides default `Unknown`. diff --git a/ballista/core/src/execution_plans/chaos_exec.rs b/ballista/core/src/execution_plans/chaos_exec.rs index 569f4da724..c56b0035c1 100644 --- a/ballista/core/src/execution_plans/chaos_exec.rs +++ b/ballista/core/src/execution_plans/chaos_exec.rs @@ -32,8 +32,10 @@ use datafusion::common::{DataFusionError, Result, Statistics, internal_err}; use datafusion::config::ConfigOptions; use datafusion::execution::TaskContext; +use datafusion::physical_plan::StatisticsArgs; use datafusion::physical_plan::execution_plan::CardinalityEffect; use datafusion::physical_plan::metrics::MetricsSet; +use datafusion::physical_plan::statistics::ChildStats; use datafusion::physical_plan::stream::RecordBatchStreamAdapter; use datafusion::physical_plan::{ DisplayAs, DisplayFormatType, ExecutionPlan, PlanProperties, @@ -213,8 +215,16 @@ impl ExecutionPlan for ChaosExec { self.input.metrics() } - fn partition_statistics(&self, partition: Option) -> Result> { - self.input.partition_statistics(partition) + fn statistics_from_inputs( + &self, + input_stats: &[Arc], + _args: &StatisticsArgs, + ) -> Result> { + Ok(Arc::clone(&input_stats[0])) + } + + fn child_stats_requests(&self, partition: Option) -> Vec { + vec![ChildStats::At(partition)] } fn supports_limit_pushdown(&self) -> bool { diff --git a/ballista/core/src/execution_plans/distributed_query.rs b/ballista/core/src/execution_plans/distributed_query.rs index 20f3234cfe..62673c398f 100644 --- a/ballista/core/src/execution_plans/distributed_query.rs +++ b/ballista/core/src/execution_plans/distributed_query.rs @@ -136,6 +136,26 @@ impl DistributedQueryExec { } } + /// Returns the scheduler URL used by this query. + pub fn scheduler_url(&self) -> &str { + &self.scheduler_url + } + + /// Returns the Ballista configuration used by this query. + pub fn config(&self) -> &BallistaConfig { + &self.config + } + + /// Returns the logical plan submitted to the scheduler. + pub fn logical_plan(&self) -> &LogicalPlan { + &self.plan + } + + /// Returns the client session identifier. + pub fn session_id(&self) -> &str { + &self.session_id + } + /// Returns the scheduler job id after the query has been accepted. pub fn job_id(&self) -> Option { self.job_id.lock().clone() @@ -227,8 +247,14 @@ impl ExecutionPlan for DistributedQueryExec { DataFusionError::Execution(format!("failed to encode logical plan: {e:?}")) })?; - let settings = context + // The FFI planner carries Ballista options in this node because the + // destination datafusion-python TaskContext does not know Ballista's + // ConfigExtension. Restore them before executing the query. + let session_config = context .session_config() + .clone() + .with_option_extension(self.config.clone()); + let settings = session_config .options() .entries() .iter() @@ -255,8 +281,6 @@ impl ExecutionPlan for DistributedQueryExec { let metric_total_bytes = MetricBuilder::new(&self.metrics).counter("transferred_bytes", partition); - let session_config = context.session_config().clone(); - if session_config.ballista_config().client_pull() { let stream = futures::stream::once( execute_query_pull( diff --git a/ballista/core/src/execution_plans/runtime_stats.rs b/ballista/core/src/execution_plans/runtime_stats.rs index 949241a163..f76484107d 100644 --- a/ballista/core/src/execution_plans/runtime_stats.rs +++ b/ballista/core/src/execution_plans/runtime_stats.rs @@ -64,7 +64,7 @@ use datafusion::physical_plan::execution_plan::CardinalityEffect; use datafusion::physical_plan::stream::RecordBatchStreamAdapter; use datafusion::physical_plan::{ DisplayAs, DisplayFormatType, ExecutionPlan, ExecutionPlanProperties, PlanProperties, - SendableRecordBatchStream, + SendableRecordBatchStream, StatisticsArgs, statistics::ChildStats, }; use datafusion_functions_aggregate_common::tdigest::TDigest; use futures::stream::StreamExt; @@ -314,8 +314,16 @@ impl ExecutionPlan for RuntimeStatsExec { } /// Row count and per-column stats pass through unchanged. - fn partition_statistics(&self, partition: Option) -> Result> { - self.input.partition_statistics(partition) + fn statistics_from_inputs( + &self, + input_stats: &[Arc], + _args: &StatisticsArgs, + ) -> Result> { + Ok(Arc::clone(&input_stats[0])) + } + + fn child_stats_requests(&self, partition: Option) -> Vec { + vec![ChildStats::At(partition)] } /// Every input row is emitted exactly once. Overrides default `Unknown`. diff --git a/ballista/core/src/execution_plans/shuffle_reader.rs b/ballista/core/src/execution_plans/shuffle_reader.rs index d85f1978fa..ebf33d7e80 100644 --- a/ballista/core/src/execution_plans/shuffle_reader.rs +++ b/ballista/core/src/execution_plans/shuffle_reader.rs @@ -1288,7 +1288,9 @@ mod tests { use datafusion::common::DataFusionError; use datafusion::datasource::memory::MemorySourceConfig; use datafusion::datasource::source::DataSourceExec; + use datafusion::physical_plan::StatisticsArgs; use datafusion::physical_plan::common; + use datafusion::physical_plan::statistics::StatisticsContext; use datafusion::prelude::SessionContext; use tempfile::{TempDir, tempdir}; @@ -1460,7 +1462,8 @@ mod tests { Partitioning::UnknownPartitioning(4), )?; - let stats = shuffle_reader_exec.partition_statistics(None)?; + let stats = StatisticsContext::new() + .compute(&shuffle_reader_exec, &StatisticsArgs::new())?; assert_eq!(8, *stats.num_rows.get_value().unwrap()); assert_eq!(80, *stats.total_byte_size.get_value().unwrap()); @@ -1511,7 +1514,10 @@ mod tests { Partitioning::UnknownPartitioning(4), )?; - let stats = shuffle_reader_exec.partition_statistics(Some(3))?; + let stats = StatisticsContext::new().compute( + &shuffle_reader_exec, + &StatisticsArgs::new().with_partition(Some(3)), + )?; assert_eq!(2, *stats.num_rows.get_value().unwrap()); assert_eq!(20, *stats.total_byte_size.get_value().unwrap()); @@ -1563,7 +1569,10 @@ mod tests { Partitioning::UnknownPartitioning(4), )?; - let stats = shuffle_reader_exec.partition_statistics(Some(4)); + let stats = StatisticsContext::new().compute( + &shuffle_reader_exec, + &StatisticsArgs::new().with_partition(Some(4)), + ); assert!(stats.is_err()); Ok(()) @@ -2218,7 +2227,9 @@ mod tests { assert_eq!(reader.properties().partitioning.partition_count(), 1); assert_eq!(reader.partition[0].len(), 3); - let stats = reader.partition_statistics(Some(0)).unwrap(); + let stats = StatisticsContext::new() + .compute(&reader, &StatisticsArgs::new().with_partition(Some(0))) + .unwrap(); assert_eq!(stats.num_rows.get_value().copied(), Some(300)); assert_eq!(stats.total_byte_size.get_value().copied(), Some(3072)); } @@ -2227,10 +2238,12 @@ mod tests { fn broadcast_reader_rejects_out_of_range_partition_index() { let schema = Arc::new(Schema::new(vec![Field::new("c", DataType::Int32, false)])); let reader = ShuffleReaderExec::try_new_broadcast(7, vec![], schema, 3).unwrap(); - let err = reader.partition_statistics(Some(1)).unwrap_err(); + let err = StatisticsContext::new() + .compute(&reader, &StatisticsArgs::new().with_partition(Some(1))) + .unwrap_err(); let msg = err.to_string(); assert!( - msg.contains("invalid partition index 1"), + msg.to_lowercase().contains("invalid partition index"), "unexpected error message: {msg}" ); } @@ -2314,11 +2327,13 @@ mod tests { )?; // partition[0] = upstream [0,1,2] -> 10+20+30 = 60 bytes, 1+2+3 = 6 rows - let stats0 = exec.partition_statistics(Some(0))?; + let stats0 = StatisticsContext::new() + .compute(&exec, &StatisticsArgs::new().with_partition(Some(0)))?; assert_eq!(60, *stats0.total_byte_size.get_value().unwrap()); assert_eq!(6, *stats0.num_rows.get_value().unwrap()); // partition[1] = upstream [3,4] -> 40+50 = 90 bytes, 4+5 = 9 rows - let stats1 = exec.partition_statistics(Some(1))?; + let stats1 = StatisticsContext::new() + .compute(&exec, &StatisticsArgs::new().with_partition(Some(1)))?; assert_eq!(90, *stats1.total_byte_size.get_value().unwrap()); assert_eq!(9, *stats1.num_rows.get_value().unwrap()); Ok(()) diff --git a/ballista/core/src/execution_plans/shuffle_writer.rs b/ballista/core/src/execution_plans/shuffle_writer.rs index 8854962d1b..7e4f4d1658 100644 --- a/ballista/core/src/execution_plans/shuffle_writer.rs +++ b/ballista/core/src/execution_plans/shuffle_writer.rs @@ -51,7 +51,7 @@ use datafusion::physical_plan::metrics::{ use datafusion::physical_plan::display::DisplayableExecutionPlan; use datafusion::physical_plan::{ DisplayAs, DisplayFormatType, ExecutionPlan, Partitioning, PlanProperties, - SendableRecordBatchStream, Statistics, + SendableRecordBatchStream, Statistics, StatisticsArgs, statistics::ChildStats, }; use futures::TryStreamExt; @@ -130,6 +130,12 @@ fn walk_child_partition_mapping( Partitioning::Hash(_, _) | Partitioning::RoundRobinBatch(_) => { return GlobalPartitionMap::KSpace; } + Partitioning::Range(_) => { + // Range-partitioning also freshly numbers its K outputs by + // range bucket, so it forms a K-space just like Hash. Global + // input ids from before the repartition are meaningless here. + return GlobalPartitionMap::KSpace; + } Partitioning::UnknownPartitioning(_) => { // RepartitionExec still exchanges rows and freshly numbers // its K outputs, so global_output_partition_ids[local] would be a @@ -764,8 +770,16 @@ impl ExecutionPlan for ShuffleWriterExec { Some(self.metrics.clone_inner()) } - fn partition_statistics(&self, partition: Option) -> Result> { - self.plan.partition_statistics(partition) + fn statistics_from_inputs( + &self, + input_stats: &[Arc], + _args: &StatisticsArgs, + ) -> Result> { + Ok(Arc::clone(&input_stats[0])) + } + + fn child_stats_requests(&self, partition: Option) -> Vec { + vec![ChildStats::At(partition)] } } diff --git a/ballista/core/src/execution_plans/sort_shuffle/writer.rs b/ballista/core/src/execution_plans/sort_shuffle/writer.rs index 7802bcb876..897f0f679f 100644 --- a/ballista/core/src/execution_plans/sort_shuffle/writer.rs +++ b/ballista/core/src/execution_plans/sort_shuffle/writer.rs @@ -59,7 +59,8 @@ use datafusion::physical_plan::repartition::REPARTITION_RANDOM_STATE; use datafusion::physical_plan::stream::RecordBatchStreamAdapter; use datafusion::physical_plan::{ DisplayAs, DisplayFormatType, ExecutionPlan, Partitioning, PlanProperties, - SendableRecordBatchStream, Statistics, displayable, + SendableRecordBatchStream, Statistics, StatisticsArgs, displayable, + statistics::ChildStats, }; use futures::{StreamExt, TryStreamExt}; use log::{debug, warn}; @@ -984,8 +985,16 @@ impl ExecutionPlan for SortShuffleWriterExec { Some(self.metrics.clone_inner()) } - fn partition_statistics(&self, partition: Option) -> Result> { - self.plan.partition_statistics(partition) + fn statistics_from_inputs( + &self, + input_stats: &[Arc], + _args: &StatisticsArgs, + ) -> Result> { + Ok(Arc::clone(&input_stats[0])) + } + + fn child_stats_requests(&self, partition: Option) -> Vec { + vec![ChildStats::At(partition)] } } diff --git a/ballista/core/src/planner.rs b/ballista/core/src/planner.rs index ecf41733b8..16cec95465 100644 --- a/ballista/core/src/planner.rs +++ b/ballista/core/src/planner.rs @@ -20,9 +20,10 @@ use crate::execution_plans::{DistributedExplainAnalyzeExec, DistributedQueryExec use crate::serde::BallistaLogicalExtensionCodec; use datafusion::arrow::datatypes::Schema; +use datafusion::catalog::Session; use datafusion::common::tree_node::{TreeNode, TreeNodeVisitor}; use datafusion::error::DataFusionError; -use datafusion::execution::context::{QueryPlanner, SessionState}; +use datafusion::execution::context::QueryPlanner; use datafusion::logical_expr::{LogicalPlan, TableScan}; use datafusion::physical_plan::ExecutionPlan; use datafusion::physical_plan::empty::EmptyExec; @@ -105,7 +106,7 @@ impl QueryPlanner for BallistaQueryPlanner { async fn create_physical_plan( &self, logical_plan: &LogicalPlan, - session_state: &SessionState, + session_state: &dyn Session, ) -> std::result::Result, DataFusionError> { log::debug!("create_physical_plan - plan: {:?}", logical_plan); // we inspect if plan scans local tables only, @@ -181,8 +182,8 @@ impl<'n> TreeNodeVisitor<'n> for LocalRun { ) -> datafusion::error::Result { match node { LogicalPlan::TableScan(TableScan { table_name, .. }) => match table_name { - datafusion::sql::TableReference::Partial { schema, .. } - | datafusion::sql::TableReference::Full { schema, .. } + datafusion::common::TableReference::Partial { schema, .. } + | datafusion::common::TableReference::Full { schema, .. } if schema.as_ref() == "information_schema" => { self.can_be_local = true; diff --git a/ballista/core/src/serde/generated/ballista.rs b/ballista/core/src/serde/generated/ballista.rs index 5bf6964eb2..326f950524 100644 --- a/ballista/core/src/serde/generated/ballista.rs +++ b/ballista/core/src/serde/generated/ballista.rs @@ -31,7 +31,7 @@ pub struct LogicalPlanCacheNode { pub struct BallistaPhysicalPlanNode { #[prost( oneof = "ballista_physical_plan_node::PhysicalPlanType", - tags = "1, 2, 3, 4, 5, 6, 7, 8, 9, 10" + tags = "1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11" )] pub physical_plan_type: ::core::option::Option< ballista_physical_plan_node::PhysicalPlanType, @@ -61,8 +61,21 @@ pub mod ballista_physical_plan_node { OrderedRangeRepartition(super::OrderedRangeRepartitionExecNode), #[prost(message, tag = "10")] PerPartitionFilter(super::PerPartitionFilterExecNode), + #[prost(message, tag = "11")] + DistributedQuery(super::DistributedQueryExecNode), } } +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct DistributedQueryExecNode { + #[prost(string, tag = "1")] + pub scheduler_url: ::prost::alloc::string::String, + #[prost(message, repeated, tag = "2")] + pub settings: ::prost::alloc::vec::Vec, + #[prost(bytes = "vec", tag = "3")] + pub logical_plan: ::prost::alloc::vec::Vec, + #[prost(string, tag = "4")] + pub session_id: ::prost::alloc::string::String, +} /// Value-range router over N locally-sorted overlapping input partitions. /// Redistributes them into K range-disjoint output partitions where each /// output is fully sorted on the routing expression. Uses N × K scatter diff --git a/ballista/core/src/serde/mod.rs b/ballista/core/src/serde/mod.rs index 3ceaa2dfd6..5f1623c062 100644 --- a/ballista/core/src/serde/mod.rs +++ b/ballista/core/src/serde/mod.rs @@ -18,15 +18,20 @@ //! This crate contains code generated from the Ballista Protocol Buffer Definition as well //! as convenience code for interacting with the generated code. -use crate::extension::BallistaCacheNode; +use crate::extension::{BallistaCacheNode, SessionConfigExt, SessionConfigHelperExt}; use crate::{error::BallistaError, serde::scheduler::Action as BallistaAction}; use arrow_flight::sql::ProstMessageExt; use datafusion::arrow::datatypes::SchemaRef; use datafusion::common::{DataFusionError, Result}; use datafusion::execution::TaskContext; +use datafusion::execution::config::SessionConfig; use datafusion::logical_expr::Extension; use datafusion::physical_plan::{ExecutionPlan, Partitioning}; +use datafusion_proto::bytes::{ + logical_plan_from_bytes_with_extension_codec, + logical_plan_to_bytes_with_extension_codec, +}; use datafusion_proto::logical_plan::file_formats::{ ArrowLogicalExtensionCodec, AvroLogicalExtensionCodec, CsvLogicalExtensionCodec, JsonLogicalExtensionCodec, ParquetLogicalExtensionCodec, @@ -38,7 +43,7 @@ use datafusion_proto::physical_plan::to_proto::serialize_partitioning; use datafusion_proto::physical_plan::to_proto::serialize_physical_sort_exprs; use datafusion_proto::physical_plan::{ DefaultPhysicalExtensionCodec, DefaultPhysicalProtoConverter, - PhysicalPlanDecodeContext, + PhysicalPlanDecodeContext, PhysicalProtoConverterExtension, }; use datafusion_proto::protobuf::proto_error; use datafusion_proto::protobuf::{LogicalPlanNode, PhysicalPlanNode}; @@ -56,10 +61,10 @@ use std::{convert::TryInto, io::Cursor}; use crate::execution_plans::sort_shuffle::SortShuffleConfig; use crate::execution_plans::{ - BufferExec, BufferMode, ChaosExec, CoalescePlan, OrderedRangeRepartitionExec, - PartitionGroup, PerPartitionFilterExec, RuntimeStatsExec, ShuffleReaderExec, - ShuffleWriterExec, SortShuffleWriterExec, UnorderedRangeRepartitionExec, - UnresolvedShuffleExec, + BufferExec, BufferMode, ChaosExec, CoalescePlan, DistributedQueryExec, + OrderedRangeRepartitionExec, PartitionGroup, PerPartitionFilterExec, + RuntimeStatsExec, ShuffleReaderExec, ShuffleWriterExec, SortShuffleWriterExec, + UnorderedRangeRepartitionExec, UnresolvedShuffleExec, }; use crate::serde::protobuf::{ ballista_logical_plan_node::LogicalPlanType, @@ -192,6 +197,21 @@ pub struct BallistaLogicalExtensionCodec { } impl BallistaLogicalExtensionCodec { + /// Creates a Ballista logical codec that delegates non-Ballista objects to + /// `default_codec` while retaining Ballista's file-format codecs. + pub fn new(default_codec: Arc) -> Self { + Self { + default_codec, + file_format_codecs: vec![ + Arc::new(ParquetLogicalExtensionCodec {}), + Arc::new(CsvLogicalExtensionCodec {}), + Arc::new(JsonLogicalExtensionCodec {}), + Arc::new(ArrowLogicalExtensionCodec {}), + Arc::new(AvroLogicalExtensionCodec {}), + ], + } + } + /// looks for a codec which can operate on this node /// returns a position of codec in the list and result. /// @@ -220,18 +240,7 @@ impl BallistaLogicalExtensionCodec { impl Default for BallistaLogicalExtensionCodec { fn default() -> Self { - Self { - default_codec: Arc::new(DefaultLogicalExtensionCodec {}), - // Position in this list is important as it will be used for decoding. - // If new codec is added it should go to last position. - file_format_codecs: vec![ - Arc::new(ParquetLogicalExtensionCodec {}), - Arc::new(CsvLogicalExtensionCodec {}), - Arc::new(JsonLogicalExtensionCodec {}), - Arc::new(ArrowLogicalExtensionCodec {}), - Arc::new(AvroLogicalExtensionCodec {}), - ], - } + Self::new(Arc::new(DefaultLogicalExtensionCodec {})) } } @@ -296,7 +305,7 @@ impl LogicalExtensionCodec for BallistaLogicalExtensionCodec { fn try_decode_table_provider( &self, buf: &[u8], - table_ref: &datafusion::sql::TableReference, + table_ref: &datafusion::common::TableReference, schema: datafusion::arrow::datatypes::SchemaRef, ctx: &TaskContext, ) -> Result> { @@ -306,7 +315,7 @@ impl LogicalExtensionCodec for BallistaLogicalExtensionCodec { fn try_encode_table_provider( &self, - table_ref: &datafusion::sql::TableReference, + table_ref: &datafusion::common::TableReference, node: Arc, buf: &mut Vec, ) -> Result<()> { @@ -349,28 +358,105 @@ impl LogicalExtensionCodec for BallistaLogicalExtensionCodec { .encode(buf) .map_err(|e| DataFusionError::Internal(e.to_string())) } + + fn try_decode_udf( + &self, + name: &str, + buf: &[u8], + ) -> Result> { + self.default_codec.try_decode_udf(name, buf) + } + + fn try_encode_udf( + &self, + node: &datafusion::logical_expr::ScalarUDF, + buf: &mut Vec, + ) -> Result<()> { + self.default_codec.try_encode_udf(node, buf) + } + + fn try_decode_higher_order_function( + &self, + name: &str, + buf: &[u8], + ) -> Result> { + self.default_codec + .try_decode_higher_order_function(name, buf) + } + + fn try_encode_higher_order_function( + &self, + node: &datafusion::logical_expr::HigherOrderUDF, + buf: &mut Vec, + ) -> Result<()> { + self.default_codec + .try_encode_higher_order_function(node, buf) + } + + fn try_decode_udaf( + &self, + name: &str, + buf: &[u8], + ) -> Result> { + self.default_codec.try_decode_udaf(name, buf) + } + + fn try_encode_udaf( + &self, + node: &datafusion::logical_expr::AggregateUDF, + buf: &mut Vec, + ) -> Result<()> { + self.default_codec.try_encode_udaf(node, buf) + } + + fn try_decode_udwf( + &self, + name: &str, + buf: &[u8], + ) -> Result> { + self.default_codec.try_decode_udwf(name, buf) + } + + fn try_encode_udwf( + &self, + node: &datafusion::logical_expr::WindowUDF, + buf: &mut Vec, + ) -> Result<()> { + self.default_codec.try_encode_udwf(node, buf) + } } /// Physical extension codec for Ballista-specific execution plan nodes. #[derive(Debug)] pub struct BallistaPhysicalExtensionCodec { default_codec: Arc, + logical_codec: Arc, } -impl Default for BallistaPhysicalExtensionCodec { - fn default() -> Self { +impl BallistaPhysicalExtensionCodec { + /// Creates a physical codec that uses `logical_codec` for logical plans + /// embedded in client-side Ballista execution nodes. + pub fn new(logical_codec: Arc) -> Self { Self { default_codec: Arc::new(DefaultPhysicalExtensionCodec {}), + logical_codec, } } } +impl Default for BallistaPhysicalExtensionCodec { + fn default() -> Self { + Self::new(Arc::new(BallistaLogicalExtensionCodec::default())) + } +} + impl PhysicalExtensionCodec for BallistaPhysicalExtensionCodec { fn try_decode( &self, buf: &[u8], inputs: &[Arc], ctx: &TaskContext, + _proto_converter: &dyn PhysicalProtoConverterExtension, ) -> Result, DataFusionError> { let ballista_plan: protobuf::BallistaPhysicalPlanNode = protobuf::BallistaPhysicalPlanNode::decode(buf).map_err(|e| { @@ -662,6 +748,31 @@ impl PhysicalExtensionCodec for BallistaPhysicalExtensionCodec { predicates, )?)) } + PhysicalPlanType::DistributedQuery(distributed_query) => { + if !inputs.is_empty() { + return Err(DataFusionError::Internal(format!( + "DistributedQueryExec expects no inputs, got {}", + inputs.len() + ))); + } + let plan = logical_plan_from_bytes_with_extension_codec( + &distributed_query.logical_plan, + ctx, + self.logical_codec.as_ref(), + )?; + let config = SessionConfig::new_with_ballista() + .update_from_key_value_pair(&distributed_query.settings) + .ballista_config(); + Ok(Arc::new( + DistributedQueryExec::::with_extension( + distributed_query.scheduler_url.clone(), + config, + plan, + Arc::clone(&self.logical_codec), + distributed_query.session_id.clone(), + ), + )) + } } } @@ -669,6 +780,7 @@ impl PhysicalExtensionCodec for BallistaPhysicalExtensionCodec { &self, node: Arc, buf: &mut Vec, + _proto_converter: &dyn PhysicalProtoConverterExtension, ) -> Result<(), DataFusionError> { if let Some(exec) = node.downcast_ref::() { let proto = protobuf::BallistaPhysicalPlanNode { @@ -922,6 +1034,38 @@ impl PhysicalExtensionCodec for BallistaPhysicalExtensionCodec { )) })?; Ok(()) + } else if let Some(exec) = + node.downcast_ref::>() + { + let logical_plan = logical_plan_to_bytes_with_extension_codec( + exec.logical_plan(), + self.logical_codec.as_ref(), + )?; + let settings = exec + .config() + .settings() + .iter() + .map(|(key, value)| protobuf::KeyValuePair { + key: key.clone(), + value: Some(value.clone()), + }) + .collect(); + let proto = protobuf::BallistaPhysicalPlanNode { + physical_plan_type: Some(PhysicalPlanType::DistributedQuery( + protobuf::DistributedQueryExecNode { + scheduler_url: exec.scheduler_url().to_string(), + settings, + logical_plan: logical_plan.to_vec(), + session_id: exec.session_id().to_string(), + }, + )), + }; + proto.encode(buf).map_err(|e| { + DataFusionError::Internal(format!( + "failed to encode distributed query execution plan: {e:?}" + )) + })?; + Ok(()) } else { Err(DataFusionError::Internal(format!( "Unsupported plan node, name: [{}] ", @@ -966,6 +1110,109 @@ mod test { use datafusion_proto::{logical_plan::AsLogicalPlan, protobuf::LogicalPlanNode}; use std::sync::Arc; + #[derive(Debug)] + struct MarkerLogicalCodec; + + impl LogicalExtensionCodec for MarkerLogicalCodec { + fn try_decode( + &self, + _buf: &[u8], + _inputs: &[LogicalPlan], + _ctx: &TaskContext, + ) -> Result { + Err(DataFusionError::Plan("marker-plan-decode".to_string())) + } + + fn try_encode(&self, _node: &Extension, _buf: &mut Vec) -> Result<()> { + Err(DataFusionError::Plan("marker-plan-encode".to_string())) + } + + fn try_decode_table_provider( + &self, + _buf: &[u8], + _table_ref: &datafusion::common::TableReference, + _schema: SchemaRef, + _ctx: &TaskContext, + ) -> Result> { + Err(DataFusionError::Plan("marker-table-decode".to_string())) + } + + fn try_encode_table_provider( + &self, + _table_ref: &datafusion::common::TableReference, + _node: Arc, + _buf: &mut Vec, + ) -> Result<()> { + Err(DataFusionError::Plan("marker-table-encode".to_string())) + } + + fn try_decode_udf( + &self, + _name: &str, + _buf: &[u8], + ) -> Result> { + Err(DataFusionError::Plan("marker-scalar".to_string())) + } + + fn try_decode_higher_order_function( + &self, + _name: &str, + _buf: &[u8], + ) -> Result> { + Err(DataFusionError::Plan("marker-higher-order".to_string())) + } + + fn try_decode_udaf( + &self, + _name: &str, + _buf: &[u8], + ) -> Result> { + Err(DataFusionError::Plan("marker-aggregate".to_string())) + } + + fn try_decode_udwf( + &self, + _name: &str, + _buf: &[u8], + ) -> Result> { + Err(DataFusionError::Plan("marker-window".to_string())) + } + } + + #[test] + fn logical_codec_delegates_function_decoding() { + let codec = BallistaLogicalExtensionCodec::new(Arc::new(MarkerLogicalCodec)); + + assert!( + codec + .try_decode_udf("udf", &[]) + .unwrap_err() + .to_string() + .contains("marker-scalar") + ); + assert!( + codec + .try_decode_udaf("udaf", &[]) + .unwrap_err() + .to_string() + .contains("marker-aggregate") + ); + assert!( + codec + .try_decode_udwf("udwf", &[]) + .unwrap_err() + .to_string() + .contains("marker-window") + ); + assert!( + codec + .try_decode_higher_order_function("higher", &[]) + .unwrap_err() + .to_string() + .contains("marker-higher-order") + ); + } + #[tokio::test] async fn file_format_serialization_roundtrip() { let ctx = SessionContext::new().task_ctx(); @@ -1059,17 +1306,11 @@ mod test { ); } - // `datafusion-proto` encodes an `EmptyExec` as its schema alone, so a - // multi-partition `EmptyExec` decodes with a single partition (apache/datafusion - // #23642). `make_empty_exec_serde_safe` in the scheduler works around this by - // rewriting such nodes into a round-robin `RepartitionExec` before a stage plan - // goes on the wire. - // - // This test pins the upstream behaviour that makes the workaround necessary: when - // it starts failing, DataFusion preserves the partition count and the workaround - // can be deleted. + // apache/datafusion#23642 is fixed upstream: `datafusion-proto` now preserves the + // partition count when round-tripping `EmptyExec`. This test locks in that + // behaviour so we notice if it ever regresses. #[tokio::test] - async fn empty_exec_partition_count_is_lost_by_datafusion_proto() { + async fn empty_exec_partition_count_survives_datafusion_proto() { use datafusion::physical_plan::ExecutionPlanProperties; use datafusion::physical_plan::empty::EmptyExec; use datafusion_proto::physical_plan::{ @@ -1092,9 +1333,46 @@ mod test { assert_eq!( decoded.output_partitioning().partition_count(), - 1, - "EmptyExec partition count is dropped on the wire; if this now decodes as \ - 4, apache/datafusion#23642 is fixed and make_empty_exec_serde_safe can go" + 4, + "EmptyExec partition count must survive round-trip through datafusion-proto" + ); + } + + #[tokio::test] + async fn test_distributed_query_exec_roundtrip() { + let logical_plan = LogicalPlan::EmptyRelation(EmptyRelation { + produce_one_row: true, + schema: Arc::new(DFSchema::empty()), + }); + let config = SessionConfig::new_with_ballista() + .set_bool(crate::config::BALLISTA_CLIENT_PULL, true) + .ballista_config(); + let original_exec = DistributedQueryExec::::new( + "http://localhost:50050".to_string(), + config, + logical_plan.clone(), + "test-session".to_string(), + ); + + let codec = BallistaPhysicalExtensionCodec::default(); + let converter = DefaultPhysicalProtoConverter {}; + let mut buf = Vec::new(); + codec + .try_encode(Arc::new(original_exec), &mut buf, &converter) + .unwrap(); + + let ctx = SessionContext::new().task_ctx(); + let decoded_plan = codec.try_decode(&buf, &[], &ctx, &converter).unwrap(); + let decoded_exec = decoded_plan + .downcast_ref::>() + .expect("Expected DistributedQueryExec"); + + assert_eq!(decoded_exec.scheduler_url(), "http://localhost:50050"); + assert_eq!(decoded_exec.session_id(), "test-session"); + assert!(decoded_exec.config().client_pull()); + assert_eq!( + decoded_exec.logical_plan().display_indent().to_string(), + logical_plan.display_indent().to_string() ); } @@ -1113,11 +1391,17 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; codec - .try_encode(Arc::new(original_exec.clone()), &mut buf) + .try_encode( + Arc::new(original_exec.clone()), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded_plan = codec.try_decode(&buf, &[], &ctx).unwrap(); + let decoded_plan = codec + .try_decode(&buf, &[], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded_exec = decoded_plan .downcast_ref::() @@ -1149,11 +1433,17 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; codec - .try_encode(Arc::new(original_exec.clone()), &mut buf) + .try_encode( + Arc::new(original_exec.clone()), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded_plan = codec.try_decode(&buf, &[], &ctx).unwrap(); + let decoded_plan = codec + .try_decode(&buf, &[], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded_exec = decoded_plan .downcast_ref::() @@ -1195,10 +1485,18 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; - codec.try_encode(Arc::new(original_exec), &mut buf).unwrap(); + codec + .try_encode( + Arc::new(original_exec), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) + .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded_plan = codec.try_decode(&buf, &[input], &ctx).unwrap(); + let decoded_plan = codec + .try_decode(&buf, &[input], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded_exec = decoded_plan .downcast_ref::() .expect("Expected SortShuffleWriterExec"); @@ -1236,11 +1534,17 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; codec - .try_encode(Arc::new(original_exec.clone()), &mut buf) + .try_encode( + Arc::new(original_exec.clone()), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded_plan = codec.try_decode(&buf, &[], &ctx).unwrap(); + let decoded_plan = codec + .try_decode(&buf, &[], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded_exec = decoded_plan .downcast_ref::() .expect("Expected ShuffleReaderExec"); @@ -1280,10 +1584,18 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; - codec.try_encode(Arc::new(original), &mut buf).unwrap(); + codec + .try_encode( + Arc::new(original), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) + .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded = codec.try_decode(&buf, &[input], &ctx).unwrap(); + let decoded = codec + .try_decode(&buf, &[input], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded = decoded .downcast_ref::() .expect("Expected SortShuffleWriterExec"); @@ -1328,11 +1640,17 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; codec - .try_encode(Arc::new(original_exec.clone()), &mut buf) + .try_encode( + Arc::new(original_exec.clone()), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded_plan = codec.try_decode(&buf, &[], &ctx).unwrap(); + let decoded_plan = codec + .try_decode(&buf, &[], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded_exec = decoded_plan .downcast_ref::() .expect("Expected ShuffleReaderExec"); @@ -1373,11 +1691,17 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; codec - .try_encode(Arc::new(original_exec.clone()), &mut buf) + .try_encode( + Arc::new(original_exec.clone()), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded_plan = codec.try_decode(&buf, &[], &ctx).unwrap(); + let decoded_plan = codec + .try_decode(&buf, &[], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded_exec = decoded_plan .downcast_ref::() .expect("Expected UnresolvedShuffleExec"); @@ -1423,11 +1747,17 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; codec - .try_encode(Arc::new(original_exec.clone()), &mut buf) + .try_encode( + Arc::new(original_exec.clone()), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded_plan = codec.try_decode(&buf, &[], &ctx).unwrap(); + let decoded_plan = codec + .try_decode(&buf, &[], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded_exec = decoded_plan .downcast_ref::() .expect("Expected ShuffleReaderExec"); @@ -1519,11 +1849,17 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; codec - .try_encode(Arc::new(original_exec.clone()), &mut buf) + .try_encode( + Arc::new(original_exec.clone()), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded_plan = codec.try_decode(&buf, &[], &ctx).unwrap(); + let decoded_plan = codec + .try_decode(&buf, &[], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded_exec = decoded_plan .downcast_ref::() @@ -1545,11 +1881,17 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; codec - .try_encode(Arc::new(original_exec.clone()), &mut buf) + .try_encode( + Arc::new(original_exec.clone()), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded_plan = codec.try_decode(&buf, &[], &ctx).unwrap(); + let decoded_plan = codec + .try_decode(&buf, &[], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded_exec = decoded_plan .downcast_ref::() @@ -1657,10 +1999,18 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; - codec.try_encode(Arc::new(original), &mut buf).unwrap(); + codec + .try_encode( + Arc::new(original), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) + .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded_plan = codec.try_decode(&buf, &[input], &ctx).unwrap(); + let decoded_plan = codec + .try_decode(&buf, &[input], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded = decoded_plan .downcast_ref::() @@ -1703,10 +2053,18 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; - codec.try_encode(Arc::new(original), &mut buf).unwrap(); + codec + .try_encode( + Arc::new(original), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) + .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded_plan = codec.try_decode(&buf, &[input], &ctx).unwrap(); + let decoded_plan = codec + .try_decode(&buf, &[input], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded = decoded_plan .downcast_ref::() .expect("Expected RuntimeStatsExec"); @@ -1839,10 +2197,18 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; - codec.try_encode(Arc::new(original), &mut buf).unwrap(); + codec + .try_encode( + Arc::new(original), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) + .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded_plan = codec.try_decode(&buf, &[input], &ctx).unwrap(); + let decoded_plan = codec + .try_decode(&buf, &[input], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded = decoded_plan .downcast_ref::() .expect("Expected PerPartitionFilterExec"); @@ -1871,10 +2237,18 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; - codec.try_encode(Arc::new(original), &mut buf).unwrap(); + codec + .try_encode( + Arc::new(original), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) + .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded_plan = codec.try_decode(&buf, &[input], &ctx).unwrap(); + let decoded_plan = codec + .try_decode(&buf, &[input], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded = decoded_plan .downcast_ref::() .expect("Expected BufferExec"); @@ -1912,10 +2286,18 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; - codec.try_encode(Arc::new(original), &mut buf).unwrap(); + codec + .try_encode( + Arc::new(original), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) + .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded_plan = codec.try_decode(&buf, &[input], &ctx).unwrap(); + let decoded_plan = codec + .try_decode(&buf, &[input], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded = decoded_plan .downcast_ref::() @@ -1965,10 +2347,18 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; - codec.try_encode(Arc::new(original), &mut buf).unwrap(); + codec + .try_encode( + Arc::new(original), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) + .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded_plan = codec.try_decode(&buf, &[input], &ctx).unwrap(); + let decoded_plan = codec + .try_decode(&buf, &[input], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded = decoded_plan .downcast_ref::() @@ -2016,10 +2406,18 @@ mod test { let codec = BallistaPhysicalExtensionCodec::default(); let mut buf: Vec = vec![]; - codec.try_encode(Arc::new(original), &mut buf).unwrap(); + codec + .try_encode( + Arc::new(original), + &mut buf, + &DefaultPhysicalProtoConverter {}, + ) + .unwrap(); let ctx = SessionContext::new().task_ctx(); - let decoded_plan = codec.try_decode(&buf, &[input], &ctx).unwrap(); + let decoded_plan = codec + .try_decode(&buf, &[input], &ctx, &DefaultPhysicalProtoConverter {}) + .unwrap(); let decoded = decoded_plan .downcast_ref::() diff --git a/ballista/core/src/serde/scheduler/to_proto.rs b/ballista/core/src/serde/scheduler/to_proto.rs index 2e78f9df50..4931f95680 100644 --- a/ballista/core/src/serde/scheduler/to_proto.rs +++ b/ballista/core/src/serde/scheduler/to_proto.rs @@ -159,6 +159,12 @@ impl TryInto for &MetricValue { value: gauge.value() as u64, })) } + MetricValue::PeakMemoryUsage { name, gauge } => { + Ok(operator_metric::Metric::Gauge(NamedGauge { + name: name.to_string(), + value: gauge.value() as u64, + })) + } MetricValue::Time { name, time } => { Ok(operator_metric::Metric::Time(NamedTime { name: name.to_string(), diff --git a/ballista/executor/src/collect.rs b/ballista/executor/src/collect.rs index 31d2bc28ca..5ac1527349 100644 --- a/ballista/executor/src/collect.rs +++ b/ballista/executor/src/collect.rs @@ -27,7 +27,7 @@ use datafusion::error::DataFusionError; use datafusion::execution::context::TaskContext; use datafusion::physical_plan::{ DisplayAs, DisplayFormatType, ExecutionPlan, Partitioning, PlanProperties, - SendableRecordBatchStream, Statistics, + SendableRecordBatchStream, Statistics, StatisticsArgs, statistics::ChildStats, }; use datafusion::{error::Result, physical_plan::RecordBatchStream}; use futures::Stream; @@ -121,8 +121,16 @@ impl ExecutionPlan for CollectExec { })) } - fn partition_statistics(&self, partition: Option) -> Result> { - self.plan.partition_statistics(partition) + fn statistics_from_inputs( + &self, + input_stats: &[Arc], + _args: &StatisticsArgs, + ) -> Result> { + Ok(Arc::clone(&input_stats[0])) + } + + fn child_stats_requests(&self, partition: Option) -> Vec { + vec![ChildStats::At(partition)] } } diff --git a/ballista/scheduler/src/physical_optimizer/join_selection.rs b/ballista/scheduler/src/physical_optimizer/join_selection.rs index 7e6ffb01c5..4bfc3b81ab 100644 --- a/ballista/scheduler/src/physical_optimizer/join_selection.rs +++ b/ballista/scheduler/src/physical_optimizer/join_selection.rs @@ -34,6 +34,8 @@ use std::sync::Arc; use datafusion::common::config::ConfigOptions; use datafusion::common::error::Result; +use datafusion::physical_plan::StatisticsArgs; +use datafusion::physical_plan::statistics::StatisticsContext; use datafusion::common::tree_node::{Transformed, TransformedResult, TreeNode}; use datafusion::common::{JoinSide, JoinType, internal_err}; @@ -72,8 +74,8 @@ pub(crate) fn should_swap_join_order( // Get the left and right table's total bytes // If both the left and right tables contain total_byte_size statistics, // use `total_byte_size` to determine `should_swap_join_order`, else use `num_rows` - let left_stats = left.partition_statistics(None)?; - let right_stats = right.partition_statistics(None)?; + let left_stats = StatisticsContext::new().compute(left, &StatisticsArgs::new())?; + let right_stats = StatisticsContext::new().compute(right, &StatisticsArgs::new())?; // First compare `total_byte_size` of left and right side, // if information in this field is insufficient fallback to the `num_rows` match ( @@ -98,7 +100,7 @@ fn supports_collect_by_thresholds( ) -> bool { // Currently we do not trust the 0 value from stats, due to stats collection might have bug // TODO check the logic in datasource::get_statistics_with_limit() - let Ok(stats) = plan.partition_statistics(None) else { + let Ok(stats) = StatisticsContext::new().compute(plan, &StatisticsArgs::new()) else { return false; }; diff --git a/ballista/scheduler/src/planner.rs b/ballista/scheduler/src/planner.rs index 0b3af8fc00..01961ded81 100644 --- a/ballista/scheduler/src/planner.rs +++ b/ballista/scheduler/src/planner.rs @@ -36,13 +36,15 @@ use datafusion::arrow::datatypes::DataType; use datafusion::common::tree_node::{Transformed, TreeNode}; use datafusion::config::ConfigOptions; use datafusion::physical_optimizer::PhysicalOptimizerRule; -use datafusion::physical_optimizer::enforce_sorting::EnforceSorting; +use datafusion::physical_optimizer::ensure_requirements::EnsureRequirements; +use datafusion::physical_plan::StatisticsArgs; use datafusion::physical_plan::coalesce_partitions::CoalescePartitionsExec; use datafusion::physical_plan::empty::EmptyExec; use datafusion::physical_plan::joins::{HashJoinExec, PartitionMode}; use datafusion::physical_plan::projection::ProjectionExec; use datafusion::physical_plan::repartition::RepartitionExec; use datafusion::physical_plan::sorts::sort_preserving_merge::SortPreservingMergeExec; +use datafusion::physical_plan::statistics::StatisticsContext; use datafusion::physical_plan::union::UnionExec; use datafusion::physical_plan::{ ExecutionPlan, Partitioning, with_new_children_if_necessary, @@ -80,8 +82,9 @@ pub trait DistributedPlanner { pub struct DefaultDistributedPlanner { /// Counter for generating unique stage IDs. next_stage_id: usize, - /// Optimizer rule for enforcing sort requirements after stage splitting. - optimizer_enforce_sorting: EnforceSorting, + /// Optimizer rule for re-enforcing distribution and sort requirements after + /// stage splitting. + optimizer_ensure_requirements: EnsureRequirements, } impl DefaultDistributedPlanner { @@ -91,8 +94,8 @@ impl DefaultDistributedPlanner { next_stage_id: 0, // when plan is broken into stages some sorting information may get lost in the process // thus stage re-optimisation is needed to adjust sort information - optimizer_enforce_sorting: - datafusion::physical_optimizer::enforce_sorting::EnforceSorting::default(), + optimizer_ensure_requirements: + datafusion::physical_optimizer::ensure_requirements::EnsureRequirements::default(), } } } @@ -238,7 +241,7 @@ impl DefaultDistributedPlanner { if let Some(_coalesce) = execution_plan.downcast_ref::() { let input = children[0].clone(); - let input = self.optimizer_enforce_sorting.optimize(input, config)?; + let input = self.optimizer_ensure_requirements.optimize(input, config)?; let shuffle_writer = create_shuffle_writer_with_config( job_id, self.next_stage_id(), @@ -273,7 +276,8 @@ impl DefaultDistributedPlanner { match repart.properties().output_partitioning() { Partitioning::Hash(_, _) => { let input = children[0].clone(); - let input = self.optimizer_enforce_sorting.optimize(input, config)?; + let input = + self.optimizer_ensure_requirements.optimize(input, config)?; let shuffle_writer = create_shuffle_writer_with_config( job_id, @@ -314,9 +318,10 @@ impl DefaultDistributedPlanner { plan: &dyn ExecutionPlan, threshold: usize, ) -> Option { - let Ok(stats) = plan.partition_statistics(None) else { + let Ok(stats) = StatisticsContext::new().compute(plan, &StatisticsArgs::new()) + else { debug!( - "broadcast check: partition_statistics returned error for {}", + "broadcast check: statistics computation returned error for {}", plan.name() ); return None; @@ -825,8 +830,12 @@ pub fn rollback_resolved_shuffles( /// its partitioning on the wire, so the count arrives intact. /// /// This runs at the point the stage plan is built for the wire, after all physical -/// optimizer rules, so no later rule can collapse the rewrite. It can be removed once -/// the partition count survives `EmptyExec` serialization upstream. +/// optimizer rules, so no later rule can collapse the rewrite. +/// +/// Retained even though upstream #23642 preserves the partition count on the wire: +/// the round-robin re-wrap is a defensive belt-and-suspenders that also normalises +/// legacy plans decoded from persisted job state, so keep it until we have a +/// migration story for those. fn make_empty_exec_serde_safe( plan: Arc, ) -> Result> { @@ -1094,10 +1103,10 @@ mod test { // verify stage 1 let stage1 = stages[1].children()[0].clone(); - let sort = downcast_exec!(stage1, SortExec); - let projection = sort.children()[0].clone(); - let projection = downcast_exec!(projection, ProjectionExec); - let final_hash = projection.children()[0].clone(); + let projection = downcast_exec!(stage1, ProjectionExec); + let sort = projection.children()[0].clone(); + let sort = downcast_exec!(sort, SortExec); + let final_hash = sort.children()[0].clone(); let final_hash = downcast_exec!(final_hash, AggregateExec); assert!(*final_hash.mode() == AggregateMode::FinalPartitioned); let unresolved_shuffle = final_hash.children()[0].clone(); @@ -1510,12 +1519,13 @@ order by assert_plan!(stages[0].as_ref(), @r" ShuffleWriterExec: partitioning: None AggregateExec: mode=Partial, gby=[], aggr=[count(Int64(1))] - ProjectionExec: expr=[] - SortMergeJoinExec: join_type=Inner, on=[(k@0, k@0)] - SortExec: expr=[k@0 ASC], preserve_partitioning=[false] - DataSourceExec: partitions=1, partition_sizes=[1] - SortExec: expr=[k@0 ASC], preserve_partitioning=[false] - DataSourceExec: partitions=1, partition_sizes=[1] + RepartitionExec: partitioning=RoundRobinBatch(2), input_partitions=1 + ProjectionExec: expr=[] + SortMergeJoinExec: join_type=Inner, on=[(k@0, k@0)] + SortExec: expr=[k@0 ASC], preserve_partitioning=[false] + DataSourceExec: partitions=1, partition_sizes=[1] + SortExec: expr=[k@0 ASC], preserve_partitioning=[false] + DataSourceExec: partitions=1, partition_sizes=[1] "); Ok(()) @@ -2115,9 +2125,9 @@ order by assert_eq!(Some(&Column::new("l_shipmode", 1)), partition_col); // stage1 - let sort = downcast_exec!(stages[1].children()[0], SortExec); - let projection = downcast_exec!(sort.children()[0], ProjectionExec); - let filter = downcast_exec!(projection.children()[0], FilterExec); + let projection = downcast_exec!(stages[1].children()[0], ProjectionExec); + let sort = downcast_exec!(projection.children()[0], SortExec); + let filter = downcast_exec!(sort.children()[0], FilterExec); let window = downcast_exec!(filter.children()[0], BoundedWindowAggExec); let partition_by = window.partition_keys(); let partition_by = match partition_by[..] { diff --git a/ballista/scheduler/src/scheduler_server/grpc.rs b/ballista/scheduler/src/scheduler_server/grpc.rs index 3b41e918c0..2aaa0a9d06 100644 --- a/ballista/scheduler/src/scheduler_server/grpc.rs +++ b/ballista/scheduler/src/scheduler_server/grpc.rs @@ -856,7 +856,7 @@ impl SchedulerServer { - let plan = deserialize_bytes(bytes).await.map_err(|e| BallistaError::DataFusionError(e.into()))?; + let plan = deserialize_bytes(&bytes).map_err(|e| BallistaError::DataFusionError(e.into()))?; let ctx = session_ctx.clone(); from_substrait_plan(&ctx.state(), &plan) diff --git a/ballista/scheduler/src/state/aqe/execution_plan/dynamic_join.rs b/ballista/scheduler/src/state/aqe/execution_plan/dynamic_join.rs index bec08bfc69..375e4742e5 100644 --- a/ballista/scheduler/src/state/aqe/execution_plan/dynamic_join.rs +++ b/ballista/scheduler/src/state/aqe/execution_plan/dynamic_join.rs @@ -16,6 +16,8 @@ // under the License. use ballista_core::config::BallistaConfig; +use datafusion::physical_plan::StatisticsArgs; +use datafusion::physical_plan::statistics::StatisticsContext; use datafusion::{ arrow::compute::SortOptions, arrow::datatypes::{DataType, Schema}, @@ -209,8 +211,8 @@ impl DynamicJoinSelectionExec { .map(|(l, r)| (Arc::clone(l), Arc::clone(r))) .unzip(); vec![ - Distribution::HashPartitioned(left_expr), - Distribution::HashPartitioned(right_expr), + Distribution::KeyPartitioned(left_expr), + Distribution::KeyPartitioned(right_expr), ] } @@ -290,8 +292,10 @@ impl DynamicJoinSelectionExec { self.join_type }; - let stats_left = self.left.partition_statistics(None)?; - let stats_right = self.right.partition_statistics(None)?; + let stats_left = StatisticsContext::new() + .compute(self.left.as_ref(), &StatisticsArgs::new())?; + let stats_right = StatisticsContext::new() + .compute(self.right.as_ref(), &StatisticsArgs::new())?; let build_stats = if swap_inputs { &stats_right } else { @@ -437,7 +441,8 @@ impl DynamicJoinSelectionExec { ) -> bool { // Currently we do not trust the 0 value from stats, due to stats collection might have bug // TODO check the logic in datasource::get_statistics_with_limit() - let Ok(stats) = plan.partition_statistics(None) else { + let Ok(stats) = StatisticsContext::new().compute(plan, &StatisticsArgs::new()) + else { return false; }; diff --git a/ballista/scheduler/src/state/aqe/optimizer_rule/distributed_exchange.rs b/ballista/scheduler/src/state/aqe/optimizer_rule/distributed_exchange.rs index 80e325566f..cc97c510c6 100644 --- a/ballista/scheduler/src/state/aqe/optimizer_rule/distributed_exchange.rs +++ b/ballista/scheduler/src/state/aqe/optimizer_rule/distributed_exchange.rs @@ -374,7 +374,7 @@ mod tests { assert_plan!(result.as_ref(), @ r" AdaptiveDatafusionExec: is_final=false, plan_id=1, stage_id=pending, stage_resolved=false - HashJoinExec: mode=CollectLeft, join_type=LeftAnti, on=[(a@0, a@0)] + HashJoinExec: mode=CollectLeft, join_type=LeftAnti, on=[(a@0, a@0)], null_aware StatisticsExec: col_count=1, row_count=Absent CoalescePartitionsExec ExchangeExec: partitioning=None, plan_id=0, stage_id=pending, stage_resolved=false diff --git a/ballista/scheduler/src/state/aqe/optimizer_rule/join_selection.rs b/ballista/scheduler/src/state/aqe/optimizer_rule/join_selection.rs index e3807ab711..69b9f87410 100644 --- a/ballista/scheduler/src/state/aqe/optimizer_rule/join_selection.rs +++ b/ballista/scheduler/src/state/aqe/optimizer_rule/join_selection.rs @@ -16,6 +16,8 @@ // under the License. use ballista_core::config::BallistaConfig; +use datafusion::physical_plan::StatisticsArgs; +use datafusion::physical_plan::statistics::StatisticsContext; use datafusion::{ catalog::memory::DataSourceExec, common::tree_node::{Transformed, TreeNode}, @@ -110,8 +112,10 @@ impl SelectJoinRule { // Get the left and right table's total bytes // If both the left and right tables contain total_byte_size statistics, // use `total_byte_size` to determine `should_swap_join_order`, else use `num_rows` - let left_stats = left.partition_statistics(None)?; - let right_stats = right.partition_statistics(None)?; + let left_stats = + StatisticsContext::new().compute(left, &StatisticsArgs::new())?; + let right_stats = + StatisticsContext::new().compute(right, &StatisticsArgs::new())?; // First compare `total_byte_size` of left and right side, // if information in this field is insufficient fallback to the `num_rows` match ( diff --git a/ballista/scheduler/src/state/aqe/optimizer_rule/propagate_empty.rs b/ballista/scheduler/src/state/aqe/optimizer_rule/propagate_empty.rs index 87331f4e02..1e4c5cdad0 100644 --- a/ballista/scheduler/src/state/aqe/optimizer_rule/propagate_empty.rs +++ b/ballista/scheduler/src/state/aqe/optimizer_rule/propagate_empty.rs @@ -26,6 +26,7 @@ use datafusion::physical_expr::PhysicalExpr; use datafusion::physical_expr::expressions::{Column, Literal}; use datafusion::physical_optimizer::PhysicalOptimizerRule; use datafusion::physical_plan::ExecutionPlan; +use datafusion::physical_plan::StatisticsArgs; use datafusion::physical_plan::aggregates::AggregateExec; #[allow(deprecated)] use datafusion::physical_plan::coalesce_batches::CoalesceBatchesExec; @@ -37,6 +38,7 @@ use datafusion::physical_plan::limit::{GlobalLimitExec, LocalLimitExec}; use datafusion::physical_plan::projection::ProjectionExec; use datafusion::physical_plan::repartition::RepartitionExec; use datafusion::physical_plan::sorts::sort_preserving_merge::SortPreservingMergeExec; +use datafusion::physical_plan::statistics::StatisticsContext; use std::sync::Arc; macro_rules! is_empty_exec { @@ -216,7 +218,8 @@ impl PropagateEmptyExecRule { _ => Ok(Transformed::no(plan)), } } else if let Some(exchange) = plan.downcast_ref::() { - let stats = exchange.partition_statistics(None)?; + let stats = + StatisticsContext::new().compute(exchange, &StatisticsArgs::new())?; match stats.num_rows { Precision::Exact(0) => empty_exec!(plan), _ => Ok(Transformed::no(plan)), @@ -277,7 +280,9 @@ pub fn as_join(plan: &Arc) -> Option> { /// Note that when we have [Precision::Absent] it means we know nothing about the value /// Hence we can't decide whether it is empty pub fn is_guaranteed_empty(plan: &Arc) -> bool { - let Ok(stats) = plan.partition_statistics(None) else { + let Ok(stats) = + StatisticsContext::new().compute(plan.as_ref(), &StatisticsArgs::new()) + else { return false; }; @@ -292,7 +297,9 @@ pub fn is_guaranteed_empty(plan: &Arc) -> bool { /// Returns true only when we have exact stats confirming the plan is non-empty. /// Precision::Absent means we know nothing — we cannot claim non-empty. pub fn is_guaranteed_non_empty(plan: &Arc) -> bool { - let Ok(stats) = plan.partition_statistics(None) else { + let Ok(stats) = + StatisticsContext::new().compute(plan.as_ref(), &StatisticsArgs::new()) + else { return false; }; diff --git a/ballista/scheduler/src/state/aqe/test/mod.rs b/ballista/scheduler/src/state/aqe/test/mod.rs index 0745a90172..5d3e2cca1b 100644 --- a/ballista/scheduler/src/state/aqe/test/mod.rs +++ b/ballista/scheduler/src/state/aqe/test/mod.rs @@ -127,7 +127,11 @@ pub(crate) fn mock_memory_table() -> Arc { pub(crate) fn mock_context() -> SessionContext { let config = SessionConfig::new() .with_target_partitions(2) - .with_round_robin_repartition(false); + .with_round_robin_repartition(false) + // Ballista disables dynamic filter pushdown in its session defaults + // because dynamic filters cannot cross stage boundaries; mirror that + // here so join-input swaps during AQE re-optimization are legal. + .set_bool("datafusion.optimizer.enable_dynamic_filter_pushdown", false); let state = SessionStateBuilder::new() .with_config(config) diff --git a/ballista/scheduler/src/state/aqe/test/plan_to_stages.rs b/ballista/scheduler/src/state/aqe/test/plan_to_stages.rs index 993996af49..98305185cb 100644 --- a/ballista/scheduler/src/state/aqe/test/plan_to_stages.rs +++ b/ballista/scheduler/src/state/aqe/test/plan_to_stages.rs @@ -194,7 +194,7 @@ async fn should_create_initial_plan() -> datafusion::error::Result<()> { AggregateExec: mode=FinalPartitioned, gby=[c0@0 as c0], aggr=[sum(t0.c0)] RepartitionExec: partitioning=Hash([c0@0], 2), input_partitions=2 AggregateExec: mode=Partial, gby=[c0@0 as c0], aggr=[sum(t0.c0)] - HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(p2@0, c2@1)], projection=[c0@1] + HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(p2@0, c2@1)], projection=[c0@0] CoalescePartitionsExec ProjectionExec: expr=[c@0 as p2] AggregateExec: mode=FinalPartitioned, gby=[c@0 as c], aggr=[] diff --git a/ballista/scheduler/src/state/execution_graph_dot.rs b/ballista/scheduler/src/state/execution_graph_dot.rs index eaef4dc5e9..3f92a91c45 100644 --- a/ballista/scheduler/src/state/execution_graph_dot.rs +++ b/ballista/scheduler/src/state/execution_graph_dot.rs @@ -363,6 +363,9 @@ fn format_partitioning(x: Partitioning) -> String { Partitioning::Hash(expr, n) => { format!("{} partitions, expr={}", n, format_expr_list(&expr)) } + Partitioning::Range(range) => { + format!("{} partitions, range", range.partition_count()) + } } } diff --git a/ballista/scheduler/src/state/task_builder.rs b/ballista/scheduler/src/state/task_builder.rs index 68811762e0..a3309f2772 100644 --- a/ballista/scheduler/src/state/task_builder.rs +++ b/ballista/scheduler/src/state/task_builder.rs @@ -176,7 +176,7 @@ fn union_child_partitions( /// `UnspecifiedDistribution`, because they consume every input partition /// without constraining how the input is partitioned. Keep the explicit /// case. -/// - Anything else: set per child from `required_input_distribution()`. An +/// - Anything else: set per child from `input_distribution_requirements()`. An /// input declared `SinglePartition` is one the operator consumes whole — /// a join or cross-join build side, for instance — so restricting it to /// the task's slice would hand each sibling task a different fraction of @@ -202,8 +202,9 @@ fn child_scopes(plan: &Arc, under_collect: bool) -> Vec if plan.is::() || plan.is::() { return vec![true; children.len()]; } - let required = plan.required_input_distribution(); - if required.len() != children.len() { + let required = plan.input_distribution_requirements(); + let per_child = required.per_child_distributions(); + if per_child.len() != children.len() { // The trait contract is one entry per child, so a mismatch means a // broken operator. Stay partition-aligned rather than reading whole: // `true` here is not the safe direction, it makes every task of the @@ -212,8 +213,7 @@ fn child_scopes(plan: &Arc, under_collect: bool) -> Vec // cases above got before this rule generalized. return vec![false; children.len()]; } - required - .into_iter() + per_child .map(|d| matches!(d, Distribution::SinglePartition)) .collect() } @@ -277,6 +277,13 @@ fn select_output_partitions( Partitioning::UnknownPartitioning(_) => { Partitioning::UnknownPartitioning(kept.len()) } + Partitioning::Range(_) => { + // Range-partitioned shuffle output is not yet produced by + // Ballista's writers, so we should never encounter it on the + // reader side. Fall back to Unknown to keep the type + // exhaustive without inventing new range boundaries. + Partitioning::UnknownPartitioning(kept.len()) + } }; let restricted = ShuffleReaderExec::try_new( reader.stage_id, @@ -630,7 +637,7 @@ mod tests { // Sanity: the operator really does declare its left input collected. assert!( matches!( - join.required_input_distribution().first(), + join.input_distribution_requirements().child_distribution(0), Some(Distribution::SinglePartition) ), "CrossJoinExec must declare SinglePartition on its left input" diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q1.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q1.txt index b01d7f2aff..29efbf3766 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q1.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q1.txt @@ -1,15 +1,15 @@ === Stage 1 === SortShuffleWriterExec: partitioning=Hash([l_returnflag@0, l_linestatus@1], 16) - AggregateExec: mode=Partial, gby=[l_returnflag@5 as l_returnflag, l_linestatus@6 as l_linestatus], aggr=[sum(lineitem.l_quantity), sum(lineitem.l_extendedprice), sum(__common_expr_1) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount), sum(__common_expr_1 * Some(1),20,0 + lineitem.l_tax) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount * Int64(1) + lineitem.l_tax), avg(lineitem.l_quantity), avg(lineitem.l_extendedprice), avg(lineitem.l_discount), count(Int64(1))] - ProjectionExec: expr=[l_extendedprice@0 * (Some(1),20,0 - l_discount@1) as __common_expr_1, l_quantity@2 as l_quantity, l_extendedprice@0 as l_extendedprice, l_discount@1 as l_discount, l_tax@3 as l_tax, l_returnflag@4 as l_returnflag, l_linestatus@5 as l_linestatus] + AggregateExec: mode=Partial, gby=[l_returnflag@5 as l_returnflag, l_linestatus@6 as l_linestatus], aggr=[sum(lineitem.l_quantity), sum(lineitem.l_extendedprice), sum(__common_expr_1) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount), sum(__common_expr_1 * 1 + lineitem.l_tax) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount * Int64(1) + lineitem.l_tax), avg(lineitem.l_quantity), avg(lineitem.l_extendedprice), avg(lineitem.l_discount), count(Int64(1))] + ProjectionExec: expr=[l_extendedprice@0 * (1 - l_discount@1) as __common_expr_1, l_quantity@2 as l_quantity, l_extendedprice@0 as l_extendedprice, l_discount@1 as l_discount, l_tax@3 as l_tax, l_returnflag@4 as l_returnflag, l_linestatus@5 as l_linestatus] FilterExec: l_shipdate@6 <= 1998-09-02, projection=[l_extendedprice@1, l_discount@2, l_quantity@0, l_tax@3, l_returnflag@4, l_linestatus@5] StatsExec: rows=600037902 === Stage 2 === ShuffleWriterExec: partitioning: None - SortExec: expr=[l_returnflag@0 ASC NULLS LAST, l_linestatus@1 ASC NULLS LAST], preserve_partitioning=[true] - ProjectionExec: expr=[l_returnflag@0 as l_returnflag, l_linestatus@1 as l_linestatus, sum(lineitem.l_quantity)@2 as sum_qty, sum(lineitem.l_extendedprice)@3 as sum_base_price, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@4 as sum_disc_price, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount * Int64(1) + lineitem.l_tax)@5 as sum_charge, avg(lineitem.l_quantity)@6 as avg_qty, avg(lineitem.l_extendedprice)@7 as avg_price, avg(lineitem.l_discount)@8 as avg_disc, count(Int64(1))@9 as count_order] - AggregateExec: mode=FinalPartitioned, gby=[l_returnflag@0 as l_returnflag, l_linestatus@1 as l_linestatus], aggr=[sum(lineitem.l_quantity), sum(lineitem.l_extendedprice), sum(__common_expr_1) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount), sum(__common_expr_1 * Some(1),20,0 + lineitem.l_tax) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount * Int64(1) + lineitem.l_tax), avg(lineitem.l_quantity), avg(lineitem.l_extendedprice), avg(lineitem.l_discount), count(Int64(1))] + ProjectionExec: expr=[l_returnflag@0 as l_returnflag, l_linestatus@1 as l_linestatus, sum(lineitem.l_quantity)@2 as sum_qty, sum(lineitem.l_extendedprice)@3 as sum_base_price, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@4 as sum_disc_price, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount * Int64(1) + lineitem.l_tax)@5 as sum_charge, avg(lineitem.l_quantity)@6 as avg_qty, avg(lineitem.l_extendedprice)@7 as avg_price, avg(lineitem.l_discount)@8 as avg_disc, count(Int64(1))@9 as count_order] + SortExec: expr=[l_returnflag@0 ASC NULLS LAST, l_linestatus@1 ASC NULLS LAST], preserve_partitioning=[true] + AggregateExec: mode=FinalPartitioned, gby=[l_returnflag@0 as l_returnflag, l_linestatus@1 as l_linestatus], aggr=[sum(lineitem.l_quantity), sum(lineitem.l_extendedprice), sum(__common_expr_1) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount), sum(__common_expr_1 * 1 + lineitem.l_tax) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount * Int64(1) + lineitem.l_tax), avg(lineitem.l_quantity), avg(lineitem.l_extendedprice), avg(lineitem.l_discount), count(Int64(1))] UnresolvedShuffleExec: stage=1, partitioning: Hash([l_returnflag@0, l_linestatus@1], 16) === Stage 3 === diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q10.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q10.txt index 7b12a86d23..b59c2f0c2f 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q10.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q10.txt @@ -36,7 +36,7 @@ SortShuffleWriterExec: partitioning=Hash([n_nationkey@0], 16) === Stage 7 === SortShuffleWriterExec: partitioning=Hash([c_custkey@0, c_name@1, c_acctbal@2, c_phone@3, n_name@4, c_address@5, c_comment@6], 16) - AggregateExec: mode=Partial, gby=[c_custkey@0 as c_custkey, c_name@1 as c_name, c_acctbal@4 as c_acctbal, c_phone@3 as c_phone, n_name@8 as n_name, c_address@2 as c_address, c_comment@5 as c_comment], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + AggregateExec: mode=Partial, gby=[c_custkey@0 as c_custkey, c_name@1 as c_name, c_acctbal@4 as c_acctbal, c_phone@3 as c_phone, n_name@8 as n_name, c_address@2 as c_address, c_comment@5 as c_comment], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] ProjectionExec: expr=[c_custkey@0 as c_custkey, c_name@1 as c_name, c_address@2 as c_address, c_phone@4 as c_phone, c_acctbal@5 as c_acctbal, c_comment@6 as c_comment, l_extendedprice@7 as l_extendedprice, l_discount@8 as l_discount, n_name@10 as n_name] SortMergeJoinExec: join_type=Inner, on=[(c_nationkey@3, n_nationkey@0)] SortExec: expr=[c_nationkey@3 ASC], preserve_partitioning=[true] @@ -46,9 +46,9 @@ SortShuffleWriterExec: partitioning=Hash([c_custkey@0, c_name@1, c_acctbal@2, c_ === Stage 8 === ShuffleWriterExec: partitioning: None - SortExec: TopK(fetch=20), expr=[revenue@2 DESC], preserve_partitioning=[true] - ProjectionExec: expr=[c_custkey@0 as c_custkey, c_name@1 as c_name, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@7 as revenue, c_acctbal@2 as c_acctbal, n_name@4 as n_name, c_address@5 as c_address, c_phone@3 as c_phone, c_comment@6 as c_comment] - AggregateExec: mode=FinalPartitioned, gby=[c_custkey@0 as c_custkey, c_name@1 as c_name, c_acctbal@2 as c_acctbal, c_phone@3 as c_phone, n_name@4 as n_name, c_address@5 as c_address, c_comment@6 as c_comment], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + ProjectionExec: expr=[c_custkey@0 as c_custkey, c_name@1 as c_name, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@7 as revenue, c_acctbal@2 as c_acctbal, n_name@4 as n_name, c_address@5 as c_address, c_phone@3 as c_phone, c_comment@6 as c_comment] + SortExec: TopK(fetch=20), expr=[sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@7 DESC], preserve_partitioning=[true] + AggregateExec: mode=FinalPartitioned, gby=[c_custkey@0 as c_custkey, c_name@1 as c_name, c_acctbal@2 as c_acctbal, c_phone@3 as c_phone, n_name@4 as n_name, c_address@5 as c_address, c_comment@6 as c_comment], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] UnresolvedShuffleExec: stage=7, partitioning: Hash([c_custkey@0, c_name@1, c_acctbal@2, c_phone@3, n_name@4, c_address@5, c_comment@6], 16) === Stage 9 === diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q12.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q12.txt index 3b86494e39..7707536367 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q12.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q12.txt @@ -19,8 +19,8 @@ SortShuffleWriterExec: partitioning=Hash([l_shipmode@0], 16) === Stage 4 === ShuffleWriterExec: partitioning: None - SortExec: expr=[l_shipmode@0 ASC NULLS LAST], preserve_partitioning=[true] - ProjectionExec: expr=[l_shipmode@0 as l_shipmode, sum(CASE WHEN orders.o_orderpriority = Utf8("1-URGENT") OR orders.o_orderpriority = Utf8("2-HIGH") THEN Int64(1) ELSE Int64(0) END)@1 as high_line_count, sum(CASE WHEN orders.o_orderpriority != Utf8("1-URGENT") AND orders.o_orderpriority != Utf8("2-HIGH") THEN Int64(1) ELSE Int64(0) END)@2 as low_line_count] + ProjectionExec: expr=[l_shipmode@0 as l_shipmode, sum(CASE WHEN orders.o_orderpriority = Utf8("1-URGENT") OR orders.o_orderpriority = Utf8("2-HIGH") THEN Int64(1) ELSE Int64(0) END)@1 as high_line_count, sum(CASE WHEN orders.o_orderpriority != Utf8("1-URGENT") AND orders.o_orderpriority != Utf8("2-HIGH") THEN Int64(1) ELSE Int64(0) END)@2 as low_line_count] + SortExec: expr=[l_shipmode@0 ASC NULLS LAST], preserve_partitioning=[true] AggregateExec: mode=FinalPartitioned, gby=[l_shipmode@0 as l_shipmode], aggr=[sum(CASE WHEN orders.o_orderpriority = Utf8("1-URGENT") OR orders.o_orderpriority = Utf8("2-HIGH") THEN Int64(1) ELSE Int64(0) END), sum(CASE WHEN orders.o_orderpriority != Utf8("1-URGENT") AND orders.o_orderpriority != Utf8("2-HIGH") THEN Int64(1) ELSE Int64(0) END)] UnresolvedShuffleExec: stage=3, partitioning: Hash([l_shipmode@0], 16) diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q13.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q13.txt index 10bc255aeb..ca52111edf 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q13.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q13.txt @@ -21,8 +21,8 @@ SortShuffleWriterExec: partitioning=Hash([c_count@0], 16) === Stage 4 === ShuffleWriterExec: partitioning: None - SortExec: expr=[custdist@1 DESC, c_count@0 DESC], preserve_partitioning=[true] - ProjectionExec: expr=[c_count@0 as c_count, count(Int64(1))@1 as custdist] + ProjectionExec: expr=[c_count@0 as c_count, count(Int64(1))@1 as custdist] + SortExec: expr=[count(Int64(1))@1 DESC, c_count@0 DESC], preserve_partitioning=[true] AggregateExec: mode=FinalPartitioned, gby=[c_count@0 as c_count], aggr=[count(Int64(1))] UnresolvedShuffleExec: stage=3, partitioning: Hash([c_count@0], 16) diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q14.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q14.txt index 5f8721f421..beae644299 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q14.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q14.txt @@ -9,8 +9,8 @@ SortShuffleWriterExec: partitioning=Hash([p_partkey@0], 16) === Stage 3 === ShuffleWriterExec: partitioning: None - AggregateExec: mode=Partial, gby=[], aggr=[sum(CASE WHEN part.p_type LIKE PROMO% THEN __common_expr_1 ELSE Some(0),38,4 END) as sum(CASE WHEN part.p_type LIKE Utf8("PROMO%") THEN lineitem.l_extendedprice * Int64(1) - lineitem.l_discount ELSE Int64(0) END), sum(__common_expr_1) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] - ProjectionExec: expr=[l_extendedprice@1 * (Some(1),20,0 - l_discount@2) as __common_expr_1, p_type@4 as p_type] + AggregateExec: mode=Partial, gby=[], aggr=[sum(CASE WHEN part.p_type LIKE PROMO% THEN __common_expr_1 ELSE 0.0000 END) as sum(CASE WHEN part.p_type LIKE Utf8("PROMO%") THEN lineitem.l_extendedprice * Int64(1) - lineitem.l_discount ELSE Int64(0) END), sum(__common_expr_1) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + ProjectionExec: expr=[l_extendedprice@1 * (1 - l_discount@2) as __common_expr_1, p_type@4 as p_type] SortMergeJoinExec: join_type=Inner, on=[(l_partkey@0, p_partkey@0)] SortExec: expr=[l_partkey@0 ASC], preserve_partitioning=[true] UnresolvedShuffleExec: stage=1, partitioning: Hash([l_partkey@0], 16) @@ -20,6 +20,6 @@ ShuffleWriterExec: partitioning: None === Stage 4 === ShuffleWriterExec: partitioning: None ProjectionExec: expr=[100 * CAST(sum(CASE WHEN part.p_type LIKE Utf8("PROMO%") THEN lineitem.l_extendedprice * Int64(1) - lineitem.l_discount ELSE Int64(0) END)@0 AS Float64) / CAST(sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@1 AS Float64) as promo_revenue] - AggregateExec: mode=Final, gby=[], aggr=[sum(CASE WHEN part.p_type LIKE PROMO% THEN __common_expr_1 ELSE Some(0),38,4 END) as sum(CASE WHEN part.p_type LIKE Utf8("PROMO%") THEN lineitem.l_extendedprice * Int64(1) - lineitem.l_discount ELSE Int64(0) END), sum(__common_expr_1) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + AggregateExec: mode=Final, gby=[], aggr=[sum(CASE WHEN part.p_type LIKE PROMO% THEN __common_expr_1 ELSE 0.0000 END) as sum(CASE WHEN part.p_type LIKE Utf8("PROMO%") THEN lineitem.l_extendedprice * Int64(1) - lineitem.l_discount ELSE Int64(0) END), sum(__common_expr_1) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] CoalescePartitionsExec UnresolvedShuffleExec: stage=3, partitioning: Hash([p_partkey@3], 16) diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q15.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q15.txt index caf8d0d9dd..c82ed09ab5 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q15.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q15.txt @@ -4,7 +4,7 @@ SortShuffleWriterExec: partitioning=Hash([s_suppkey@0], 16) === Stage 2 === SortShuffleWriterExec: partitioning=Hash([l_suppkey@0], 16) - AggregateExec: mode=Partial, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + AggregateExec: mode=Partial, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] FilterExec: l_shipdate@3 >= 1996-01-01 AND l_shipdate@3 < 1996-04-01, projection=[l_suppkey@0, l_extendedprice@1, l_discount@2] StatsExec: rows=600037902 @@ -14,14 +14,14 @@ SortShuffleWriterExec: partitioning=Hash([total_revenue@4], 16) SortMergeJoinExec: join_type=Inner, on=[(s_suppkey@0, supplier_no@0)] SortExec: expr=[s_suppkey@0 ASC], preserve_partitioning=[true] UnresolvedShuffleExec: stage=1, partitioning: Hash([s_suppkey@0], 16) - SortExec: expr=[supplier_no@0 ASC], preserve_partitioning=[true] - ProjectionExec: expr=[l_suppkey@0 as supplier_no, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@1 as total_revenue] - AggregateExec: mode=FinalPartitioned, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + ProjectionExec: expr=[l_suppkey@0 as supplier_no, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@1 as total_revenue] + SortExec: expr=[l_suppkey@0 ASC], preserve_partitioning=[true] + AggregateExec: mode=FinalPartitioned, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] UnresolvedShuffleExec: stage=2, partitioning: Hash([l_suppkey@0], 16) === Stage 4 === SortShuffleWriterExec: partitioning=Hash([l_suppkey@0], 16) - AggregateExec: mode=Partial, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + AggregateExec: mode=Partial, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] FilterExec: l_shipdate@3 >= 1996-01-01 AND l_shipdate@3 < 1996-04-01, projection=[l_suppkey@0, l_extendedprice@1, l_discount@2] StatsExec: rows=600037902 @@ -29,7 +29,7 @@ SortShuffleWriterExec: partitioning=Hash([l_suppkey@0], 16) ShuffleWriterExec: partitioning: None AggregateExec: mode=Partial, gby=[], aggr=[max(revenue0.total_revenue)] ProjectionExec: expr=[sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@1 as total_revenue] - AggregateExec: mode=FinalPartitioned, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + AggregateExec: mode=FinalPartitioned, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] UnresolvedShuffleExec: stage=4, partitioning: Hash([l_suppkey@0], 16) === Stage 6 === diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q16.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q16.txt index 2a62656215..bf85900ab3 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q16.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q16.txt @@ -4,7 +4,7 @@ SortShuffleWriterExec: partitioning=Hash([ps_partkey@0], 16) === Stage 2 === SortShuffleWriterExec: partitioning=Hash([p_partkey@0], 16) - FilterExec: p_brand@1 != Brand#45 AND p_type@2 NOT LIKE MEDIUM POLISHED% AND p_size@3 IN (SET) ([49, 14, 23, 45, 19, 3, 36, 9]) + FilterExec: p_brand@1 != Brand#45 AND p_size@3 IN (SET) ([49, 14, 23, 45, 19, 3, 36, 9]) AND p_type@2 NOT LIKE MEDIUM POLISHED% StatsExec: rows=20000000 === Stage 3 === @@ -33,8 +33,8 @@ SortShuffleWriterExec: partitioning=Hash([p_brand@0, p_type@1, p_size@2], 16) === Stage 6 === ShuffleWriterExec: partitioning: None - SortExec: expr=[supplier_cnt@3 DESC, p_brand@0 ASC NULLS LAST, p_type@1 ASC NULLS LAST, p_size@2 ASC NULLS LAST], preserve_partitioning=[true] - ProjectionExec: expr=[p_brand@0 as p_brand, p_type@1 as p_type, p_size@2 as p_size, count(alias1)@3 as supplier_cnt] + ProjectionExec: expr=[p_brand@0 as p_brand, p_type@1 as p_type, p_size@2 as p_size, count(alias1)@3 as supplier_cnt] + SortExec: expr=[count(alias1)@3 DESC, p_brand@0 ASC NULLS LAST, p_type@1 ASC NULLS LAST, p_size@2 ASC NULLS LAST], preserve_partitioning=[true] AggregateExec: mode=FinalPartitioned, gby=[p_brand@0 as p_brand, p_type@1 as p_type, p_size@2 as p_size], aggr=[count(alias1)] UnresolvedShuffleExec: stage=5, partitioning: Hash([p_brand@0, p_type@1, p_size@2], 16) diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q17.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q17.txt index a74197f02d..20e64a1963 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q17.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q17.txt @@ -16,7 +16,7 @@ SortShuffleWriterExec: partitioning=Hash([l_partkey@0], 16) ShuffleWriterExec: partitioning: None AggregateExec: mode=Partial, gby=[], aggr=[sum(lineitem.l_extendedprice)] ProjectionExec: expr=[l_extendedprice@1 as l_extendedprice] - SortMergeJoinExec: join_type=Inner, on=[(p_partkey@2, l_partkey@1)], filter=CAST(l_quantity@0 AS Decimal128(30, 15)) < Float64(0.2) * avg(lineitem.l_quantity)@1 + SortMergeJoinExec: join_type=LeftSemi, on=[(p_partkey@2, l_partkey@1)], filter=CAST(l_quantity@0 AS Decimal128(30, 15)) < Float64(0.2) * avg(lineitem.l_quantity)@1 ProjectionExec: expr=[l_quantity@1 as l_quantity, l_extendedprice@2 as l_extendedprice, p_partkey@3 as p_partkey] SortMergeJoinExec: join_type=Inner, on=[(l_partkey@0, p_partkey@0)] SortExec: expr=[l_partkey@0 ASC], preserve_partitioning=[true] @@ -33,4 +33,4 @@ ShuffleWriterExec: partitioning: None ProjectionExec: expr=[CAST(sum(lineitem.l_extendedprice)@0 AS Float64) / 7 as avg_yearly] AggregateExec: mode=Final, gby=[], aggr=[sum(lineitem.l_extendedprice)] CoalescePartitionsExec - UnresolvedShuffleExec: stage=4, partitioning: Hash([l_partkey@4], 16) + UnresolvedShuffleExec: stage=4, partitioning: Hash([p_partkey@2], 16) diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q18.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q18.txt index 7cfabb07ef..aca5a06ebf 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q18.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q18.txt @@ -36,7 +36,7 @@ ShuffleWriterExec: partitioning: None SortExec: expr=[l_orderkey@0 ASC], preserve_partitioning=[true] UnresolvedShuffleExec: stage=4, partitioning: Hash([l_orderkey@0], 16) SortExec: expr=[l_orderkey@0 ASC], preserve_partitioning=[true] - FilterExec: sum(lineitem.l_quantity)@1 > Some(30000),25,2, projection=[l_orderkey@0] + FilterExec: sum(lineitem.l_quantity)@1 > 300.00, projection=[l_orderkey@0] AggregateExec: mode=FinalPartitioned, gby=[l_orderkey@0 as l_orderkey], aggr=[sum(lineitem.l_quantity)] UnresolvedShuffleExec: stage=5, partitioning: Hash([l_orderkey@0], 16) diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q19.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q19.txt index acd9d8cf14..fefda7d029 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q19.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q19.txt @@ -1,6 +1,6 @@ === Stage 1 === SortShuffleWriterExec: partitioning=Hash([l_partkey@0], 16) - FilterExec: (l_shipmode@5 = AIR OR l_shipmode@5 = AIR REG) AND l_shipinstruct@4 = DELIVER IN PERSON AND (l_quantity@1 >= Some(100),15,2 AND l_quantity@1 <= Some(1100),15,2 OR l_quantity@1 >= Some(1000),15,2 AND l_quantity@1 <= Some(2000),15,2 OR l_quantity@1 >= Some(2000),15,2 AND l_quantity@1 <= Some(3000),15,2), projection=[l_partkey@0, l_quantity@1, l_extendedprice@2, l_discount@3] + FilterExec: (l_shipmode@5 = AIR OR l_shipmode@5 = AIR REG) AND l_shipinstruct@4 = DELIVER IN PERSON AND (l_quantity@1 >= 1.00 AND l_quantity@1 <= 11.00 OR l_quantity@1 >= 10.00 AND l_quantity@1 <= 20.00 OR l_quantity@1 >= 20.00 AND l_quantity@1 <= 30.00), projection=[l_partkey@0, l_quantity@1, l_extendedprice@2, l_discount@3] StatsExec: rows=600037902 === Stage 2 === @@ -10,9 +10,9 @@ SortShuffleWriterExec: partitioning=Hash([p_partkey@0], 16) === Stage 3 === ShuffleWriterExec: partitioning: None - AggregateExec: mode=Partial, gby=[], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + AggregateExec: mode=Partial, gby=[], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] ProjectionExec: expr=[l_extendedprice@2 as l_extendedprice, l_discount@3 as l_discount] - SortMergeJoinExec: join_type=Inner, on=[(l_partkey@0, p_partkey@0)], filter=p_brand@1 = Brand#12 AND p_container@3 IN (SET) ([SM CASE, SM BOX, SM PACK, SM PKG]) AND l_quantity@0 >= Some(100),15,2 AND l_quantity@0 <= Some(1100),15,2 AND p_size@2 <= 5 OR p_brand@1 = Brand#23 AND p_container@3 IN (SET) ([MED BAG, MED BOX, MED PKG, MED PACK]) AND l_quantity@0 >= Some(1000),15,2 AND l_quantity@0 <= Some(2000),15,2 AND p_size@2 <= 10 OR p_brand@1 = Brand#34 AND p_container@3 IN (SET) ([LG CASE, LG BOX, LG PACK, LG PKG]) AND l_quantity@0 >= Some(2000),15,2 AND l_quantity@0 <= Some(3000),15,2 AND p_size@2 <= 15 + SortMergeJoinExec: join_type=Inner, on=[(l_partkey@0, p_partkey@0)], filter=p_brand@1 = Brand#12 AND p_container@3 IN (SET) ([SM CASE, SM BOX, SM PACK, SM PKG]) AND l_quantity@0 >= 1.00 AND l_quantity@0 <= 11.00 AND p_size@2 <= 5 OR p_brand@1 = Brand#23 AND p_container@3 IN (SET) ([MED BAG, MED BOX, MED PKG, MED PACK]) AND l_quantity@0 >= 10.00 AND l_quantity@0 <= 20.00 AND p_size@2 <= 10 OR p_brand@1 = Brand#34 AND p_container@3 IN (SET) ([LG CASE, LG BOX, LG PACK, LG PKG]) AND l_quantity@0 >= 20.00 AND l_quantity@0 <= 30.00 AND p_size@2 <= 15 SortExec: expr=[l_partkey@0 ASC], preserve_partitioning=[true] UnresolvedShuffleExec: stage=1, partitioning: Hash([l_partkey@0], 16) SortExec: expr=[p_partkey@0 ASC], preserve_partitioning=[true] @@ -21,6 +21,6 @@ ShuffleWriterExec: partitioning: None === Stage 4 === ShuffleWriterExec: partitioning: None ProjectionExec: expr=[sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@0 as revenue] - AggregateExec: mode=Final, gby=[], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + AggregateExec: mode=Final, gby=[], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] CoalescePartitionsExec UnresolvedShuffleExec: stage=3, partitioning: Hash([p_partkey@4], 16) diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q2.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q2.txt index ee10151895..0490884f6b 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q2.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q2.txt @@ -111,7 +111,7 @@ SortShuffleWriterExec: partitioning=Hash([ps_partkey@1, min(partsupp.ps_supplyco ShuffleWriterExec: partitioning: None SortExec: TopK(fetch=100), expr=[s_acctbal@0 DESC, n_name@2 ASC NULLS LAST, s_name@1 ASC NULLS LAST, p_partkey@3 ASC NULLS LAST], preserve_partitioning=[true] ProjectionExec: expr=[s_acctbal@5 as s_acctbal, s_name@2 as s_name, n_name@8 as n_name, p_partkey@0 as p_partkey, p_mfgr@1 as p_mfgr, s_address@3 as s_address, s_phone@4 as s_phone, s_comment@6 as s_comment] - SortMergeJoinExec: join_type=Inner, on=[(p_partkey@0, ps_partkey@1), (ps_supplycost@7, min(partsupp.ps_supplycost)@0)] + SortMergeJoinExec: join_type=LeftSemi, on=[(p_partkey@0, ps_partkey@1), (ps_supplycost@7, min(partsupp.ps_supplycost)@0)] SortExec: expr=[p_partkey@0 ASC, ps_supplycost@7 ASC], preserve_partitioning=[true] UnresolvedShuffleExec: stage=9, partitioning: Hash([p_partkey@0, ps_supplycost@7], 16) SortExec: expr=[ps_partkey@1 ASC, min(partsupp.ps_supplycost)@0 ASC], preserve_partitioning=[true] @@ -120,4 +120,4 @@ ShuffleWriterExec: partitioning: None === Stage 19 === ShuffleWriterExec: partitioning: None SortPreservingMergeExec: [s_acctbal@0 DESC, n_name@2 ASC NULLS LAST, s_name@1 ASC NULLS LAST, p_partkey@3 ASC NULLS LAST], fetch=100 - UnresolvedShuffleExec: stage=18, partitioning: Hash([p_partkey@3, min(partsupp.ps_supplycost)@9], 16) + UnresolvedShuffleExec: stage=18, partitioning: Hash([p_partkey@3, ps_supplycost@7], 16) diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q20.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q20.txt index de78d20fb1..8d5118be1f 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q20.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q20.txt @@ -42,7 +42,7 @@ SortShuffleWriterExec: partitioning=Hash([l_partkey@0, l_suppkey@1], 16) === Stage 8 === SortShuffleWriterExec: partitioning=Hash([ps_suppkey@0], 16) ProjectionExec: expr=[ps_suppkey@1 as ps_suppkey] - SortMergeJoinExec: join_type=Inner, on=[(ps_partkey@0, l_partkey@1), (ps_suppkey@1, l_suppkey@2)], filter=CAST(ps_availqty@0 AS Float64) > Float64(0.5) * sum(lineitem.l_quantity)@1 + SortMergeJoinExec: join_type=LeftSemi, on=[(ps_partkey@0, l_partkey@1), (ps_suppkey@1, l_suppkey@2)], filter=CAST(ps_availqty@0 AS Float64) > Float64(0.5) * sum(lineitem.l_quantity)@1 SortExec: expr=[ps_partkey@0 ASC, ps_suppkey@1 ASC], preserve_partitioning=[true] UnresolvedShuffleExec: stage=6, partitioning: Hash([ps_partkey@0, ps_suppkey@1], 16) SortExec: expr=[l_partkey@1 ASC, l_suppkey@2 ASC], preserve_partitioning=[true] diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q21.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q21.txt index 003c45c938..6d03dbe5ea 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q21.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q21.txt @@ -68,8 +68,8 @@ SortShuffleWriterExec: partitioning=Hash([s_name@0], 16) === Stage 11 === ShuffleWriterExec: partitioning: None - SortExec: TopK(fetch=100), expr=[numwait@1 DESC, s_name@0 ASC NULLS LAST], preserve_partitioning=[true] - ProjectionExec: expr=[s_name@0 as s_name, count(Int64(1))@1 as numwait] + ProjectionExec: expr=[s_name@0 as s_name, count(Int64(1))@1 as numwait] + SortExec: TopK(fetch=100), expr=[count(Int64(1))@1 DESC, s_name@0 ASC NULLS LAST], preserve_partitioning=[true] AggregateExec: mode=FinalPartitioned, gby=[s_name@0 as s_name], aggr=[count(Int64(1))] UnresolvedShuffleExec: stage=10, partitioning: Hash([s_name@0], 16) diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q22.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q22.txt index 8255afee9a..3d01e97a48 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q22.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q22.txt @@ -13,7 +13,7 @@ SortShuffleWriterExec: partitioning=Hash([cntrycode@0], 16) ProjectionExec: expr=[substr(c_phone@1, 1, 2) as cntrycode, c_acctbal@2 as c_acctbal] NestedLoopJoinExec: join_type=Inner, filter=join_proj_push_down_1@1 > avg(customer.c_acctbal)@0, projection=[avg(customer.c_acctbal)@0, c_phone@1, c_acctbal@2] AggregateExec: mode=Single, gby=[], aggr=[avg(customer.c_acctbal)] - FilterExec: c_acctbal@1 > Some(0),15,2 AND substr(c_phone@0, 1, 2) IN (SET) ([13, 31, 23, 29, 30, 18, 17]), projection=[c_acctbal@1] + FilterExec: c_acctbal@1 > 0.00 AND substr(c_phone@0, 1, 2) IN (SET) ([13, 31, 23, 29, 30, 18, 17]), projection=[c_acctbal@1] StatsExec: rows=15000000 ProjectionExec: expr=[c_phone@1 as c_phone, c_acctbal@2 as c_acctbal, CAST(c_acctbal@2 AS Decimal128(19, 6)) as join_proj_push_down_1] SortMergeJoinExec: join_type=LeftAnti, on=[(c_custkey@0, o_custkey@0)] @@ -24,8 +24,8 @@ SortShuffleWriterExec: partitioning=Hash([cntrycode@0], 16) === Stage 4 === ShuffleWriterExec: partitioning: None - SortExec: expr=[cntrycode@0 ASC NULLS LAST], preserve_partitioning=[true] - ProjectionExec: expr=[cntrycode@0 as cntrycode, count(Int64(1))@1 as numcust, sum(custsale.c_acctbal)@2 as totacctbal] + ProjectionExec: expr=[cntrycode@0 as cntrycode, count(Int64(1))@1 as numcust, sum(custsale.c_acctbal)@2 as totacctbal] + SortExec: expr=[cntrycode@0 ASC NULLS LAST], preserve_partitioning=[true] AggregateExec: mode=FinalPartitioned, gby=[cntrycode@0 as cntrycode], aggr=[count(Int64(1)), sum(custsale.c_acctbal)] UnresolvedShuffleExec: stage=3, partitioning: Hash([cntrycode@0], 16) diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q3.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q3.txt index ea275d184b..f8049b08ce 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q3.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q3.txt @@ -24,9 +24,9 @@ SortShuffleWriterExec: partitioning=Hash([l_orderkey@0], 16) === Stage 5 === ShuffleWriterExec: partitioning: None - SortExec: TopK(fetch=10), expr=[revenue@1 DESC, o_orderdate@2 ASC NULLS LAST], preserve_partitioning=[true] - ProjectionExec: expr=[l_orderkey@0 as l_orderkey, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@3 as revenue, o_orderdate@1 as o_orderdate, o_shippriority@2 as o_shippriority] - AggregateExec: mode=SinglePartitioned, gby=[l_orderkey@2 as l_orderkey, o_orderdate@0 as o_orderdate, o_shippriority@1 as o_shippriority], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)], ordering_mode=PartiallySorted([0]) + ProjectionExec: expr=[l_orderkey@0 as l_orderkey, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@3 as revenue, o_orderdate@1 as o_orderdate, o_shippriority@2 as o_shippriority] + SortExec: TopK(fetch=10), expr=[sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@3 DESC, o_orderdate@1 ASC NULLS LAST], preserve_partitioning=[true] + AggregateExec: mode=SinglePartitioned, gby=[l_orderkey@2 as l_orderkey, o_orderdate@0 as o_orderdate, o_shippriority@1 as o_shippriority], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)], ordering_mode=PartiallySorted([0]) ProjectionExec: expr=[o_orderdate@1 as o_orderdate, o_shippriority@2 as o_shippriority, l_orderkey@3 as l_orderkey, l_extendedprice@4 as l_extendedprice, l_discount@5 as l_discount] SortMergeJoinExec: join_type=Inner, on=[(o_orderkey@0, l_orderkey@0)] SortExec: expr=[o_orderkey@0 ASC], preserve_partitioning=[true] diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q4.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q4.txt index 5e05011fef..4df80b9342 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q4.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q4.txt @@ -20,8 +20,8 @@ SortShuffleWriterExec: partitioning=Hash([o_orderpriority@0], 16) === Stage 4 === ShuffleWriterExec: partitioning: None - SortExec: expr=[o_orderpriority@0 ASC NULLS LAST], preserve_partitioning=[true] - ProjectionExec: expr=[o_orderpriority@0 as o_orderpriority, count(Int64(1))@1 as order_count] + ProjectionExec: expr=[o_orderpriority@0 as o_orderpriority, count(Int64(1))@1 as order_count] + SortExec: expr=[o_orderpriority@0 ASC NULLS LAST], preserve_partitioning=[true] AggregateExec: mode=FinalPartitioned, gby=[o_orderpriority@0 as o_orderpriority], aggr=[count(Int64(1))] UnresolvedShuffleExec: stage=3, partitioning: Hash([o_orderpriority@0], 16) diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q5.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q5.txt index 8849e6c0bb..c3dcae5ec2 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q5.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q5.txt @@ -62,7 +62,7 @@ SortShuffleWriterExec: partitioning=Hash([r_regionkey@0], 16) === Stage 11 === SortShuffleWriterExec: partitioning=Hash([n_name@0], 16) - AggregateExec: mode=Partial, gby=[n_name@2 as n_name], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + AggregateExec: mode=Partial, gby=[n_name@2 as n_name], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] ProjectionExec: expr=[l_extendedprice@0 as l_extendedprice, l_discount@1 as l_discount, n_name@2 as n_name] SortMergeJoinExec: join_type=Inner, on=[(n_regionkey@3, r_regionkey@0)] SortExec: expr=[n_regionkey@3 ASC], preserve_partitioning=[true] @@ -72,9 +72,9 @@ SortShuffleWriterExec: partitioning=Hash([n_name@0], 16) === Stage 12 === ShuffleWriterExec: partitioning: None - SortExec: expr=[revenue@1 DESC], preserve_partitioning=[true] - ProjectionExec: expr=[n_name@0 as n_name, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@1 as revenue] - AggregateExec: mode=FinalPartitioned, gby=[n_name@0 as n_name], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + ProjectionExec: expr=[n_name@0 as n_name, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@1 as revenue] + SortExec: expr=[sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@1 DESC], preserve_partitioning=[true] + AggregateExec: mode=FinalPartitioned, gby=[n_name@0 as n_name], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] UnresolvedShuffleExec: stage=11, partitioning: Hash([n_name@0], 16) === Stage 13 === diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q6.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q6.txt index 1da12a0cb1..3a70454e32 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q6.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q6.txt @@ -2,5 +2,5 @@ ShuffleWriterExec: partitioning: None ProjectionExec: expr=[sum(lineitem.l_extendedprice * lineitem.l_discount)@0 as revenue] AggregateExec: mode=Single, gby=[], aggr=[sum(lineitem.l_extendedprice * lineitem.l_discount)] - FilterExec: l_shipdate@3 >= 1994-01-01 AND l_shipdate@3 < 1995-01-01 AND l_discount@2 >= Some(5),15,2 AND l_discount@2 <= Some(7),15,2 AND l_quantity@0 < Some(2400),15,2, projection=[l_extendedprice@1, l_discount@2] + FilterExec: l_shipdate@3 >= 1994-01-01 AND l_shipdate@3 < 1995-01-01 AND l_discount@2 >= 0.05 AND l_discount@2 <= 0.07 AND l_quantity@0 < 24.00, projection=[l_extendedprice@1, l_discount@2] StatsExec: rows=600037902 diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q7.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q7.txt index e2fbadd62c..8f877e6d4b 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q7.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q7.txt @@ -64,7 +64,7 @@ SortShuffleWriterExec: partitioning=Hash([n_nationkey@0], 16) === Stage 11 === SortShuffleWriterExec: partitioning=Hash([supp_nation@0, cust_nation@1, l_year@2], 16) AggregateExec: mode=Partial, gby=[supp_nation@0 as supp_nation, cust_nation@1 as cust_nation, l_year@2 as l_year], aggr=[sum(shipping.volume)] - ProjectionExec: expr=[n_name@4 as supp_nation, n_name@6 as cust_nation, date_part(YEAR, l_shipdate@2) as l_year, l_extendedprice@0 * (Some(1),20,0 - l_discount@1) as volume] + ProjectionExec: expr=[n_name@4 as supp_nation, n_name@6 as cust_nation, date_part(YEAR, l_shipdate@2) as l_year, l_extendedprice@0 * (1 - l_discount@1) as volume] SortMergeJoinExec: join_type=Inner, on=[(c_nationkey@3, n_nationkey@0)], filter=n_name@0 = FRANCE AND n_name@1 = GERMANY OR n_name@0 = GERMANY AND n_name@1 = FRANCE SortExec: expr=[c_nationkey@3 ASC], preserve_partitioning=[true] UnresolvedShuffleExec: stage=9, partitioning: Hash([c_nationkey@3], 16) @@ -73,8 +73,8 @@ SortShuffleWriterExec: partitioning=Hash([supp_nation@0, cust_nation@1, l_year@2 === Stage 12 === ShuffleWriterExec: partitioning: None - SortExec: expr=[supp_nation@0 ASC NULLS LAST, cust_nation@1 ASC NULLS LAST, l_year@2 ASC NULLS LAST], preserve_partitioning=[true] - ProjectionExec: expr=[supp_nation@0 as supp_nation, cust_nation@1 as cust_nation, l_year@2 as l_year, sum(shipping.volume)@3 as revenue] + ProjectionExec: expr=[supp_nation@0 as supp_nation, cust_nation@1 as cust_nation, l_year@2 as l_year, sum(shipping.volume)@3 as revenue] + SortExec: expr=[supp_nation@0 ASC NULLS LAST, cust_nation@1 ASC NULLS LAST, l_year@2 ASC NULLS LAST], preserve_partitioning=[true] AggregateExec: mode=FinalPartitioned, gby=[supp_nation@0 as supp_nation, cust_nation@1 as cust_nation, l_year@2 as l_year], aggr=[sum(shipping.volume)] UnresolvedShuffleExec: stage=11, partitioning: Hash([supp_nation@0, cust_nation@1, l_year@2], 16) diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q8.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q8.txt index 77ca93cd28..a595e9fd17 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q8.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q8.txt @@ -89,8 +89,8 @@ SortShuffleWriterExec: partitioning=Hash([r_regionkey@0], 16) === Stage 15 === SortShuffleWriterExec: partitioning=Hash([o_year@0], 16) - AggregateExec: mode=Partial, gby=[o_year@0 as o_year], aggr=[sum(CASE WHEN all_nations.nation = BRAZIL THEN all_nations.volume ELSE Some(0),38,4 END) as sum(CASE WHEN all_nations.nation = Utf8("BRAZIL") THEN all_nations.volume ELSE Int64(0) END), sum(all_nations.volume)] - ProjectionExec: expr=[date_part(YEAR, o_orderdate@2) as o_year, l_extendedprice@0 * (Some(1),20,0 - l_discount@1) as volume, n_name@4 as nation] + AggregateExec: mode=Partial, gby=[o_year@0 as o_year], aggr=[sum(CASE WHEN all_nations.nation = BRAZIL THEN all_nations.volume ELSE 0.0000 END) as sum(CASE WHEN all_nations.nation = Utf8("BRAZIL") THEN all_nations.volume ELSE Int64(0) END), sum(all_nations.volume)] + ProjectionExec: expr=[date_part(YEAR, o_orderdate@2) as o_year, l_extendedprice@0 * (1 - l_discount@1) as volume, n_name@4 as nation] SortMergeJoinExec: join_type=Inner, on=[(n_regionkey@3, r_regionkey@0)] SortExec: expr=[n_regionkey@3 ASC], preserve_partitioning=[true] UnresolvedShuffleExec: stage=13, partitioning: Hash([n_regionkey@3], 16) @@ -101,7 +101,7 @@ SortShuffleWriterExec: partitioning=Hash([o_year@0], 16) ShuffleWriterExec: partitioning: None SortExec: expr=[o_year@0 ASC NULLS LAST], preserve_partitioning=[true] ProjectionExec: expr=[o_year@0 as o_year, sum(CASE WHEN all_nations.nation = Utf8("BRAZIL") THEN all_nations.volume ELSE Int64(0) END)@1 / sum(all_nations.volume)@2 as mkt_share] - AggregateExec: mode=FinalPartitioned, gby=[o_year@0 as o_year], aggr=[sum(CASE WHEN all_nations.nation = BRAZIL THEN all_nations.volume ELSE Some(0),38,4 END) as sum(CASE WHEN all_nations.nation = Utf8("BRAZIL") THEN all_nations.volume ELSE Int64(0) END), sum(all_nations.volume)] + AggregateExec: mode=FinalPartitioned, gby=[o_year@0 as o_year], aggr=[sum(CASE WHEN all_nations.nation = BRAZIL THEN all_nations.volume ELSE 0.0000 END) as sum(CASE WHEN all_nations.nation = Utf8("BRAZIL") THEN all_nations.volume ELSE Int64(0) END), sum(all_nations.volume)] UnresolvedShuffleExec: stage=15, partitioning: Hash([o_year@0], 16) === Stage 17 === diff --git a/ballista/scheduler/tests/tpch_plan_stability/approved/q9.txt b/ballista/scheduler/tests/tpch_plan_stability/approved/q9.txt index 48b15bca3a..95dd57e663 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/approved/q9.txt +++ b/ballista/scheduler/tests/tpch_plan_stability/approved/q9.txt @@ -62,7 +62,7 @@ SortShuffleWriterExec: partitioning=Hash([n_nationkey@0], 16) === Stage 11 === SortShuffleWriterExec: partitioning=Hash([nation@0, o_year@1], 16) AggregateExec: mode=Partial, gby=[nation@0 as nation, o_year@1 as o_year], aggr=[sum(profit.amount)] - ProjectionExec: expr=[n_name@7 as nation, date_part(YEAR, o_orderdate@5) as o_year, l_extendedprice@1 * (Some(1),20,0 - l_discount@2) - ps_supplycost@4 * l_quantity@0 as amount] + ProjectionExec: expr=[n_name@7 as nation, date_part(YEAR, o_orderdate@5) as o_year, l_extendedprice@1 * (1 - l_discount@2) - ps_supplycost@4 * l_quantity@0 as amount] SortMergeJoinExec: join_type=Inner, on=[(s_nationkey@3, n_nationkey@0)] SortExec: expr=[s_nationkey@3 ASC], preserve_partitioning=[true] UnresolvedShuffleExec: stage=9, partitioning: Hash([s_nationkey@3], 16) @@ -71,8 +71,8 @@ SortShuffleWriterExec: partitioning=Hash([nation@0, o_year@1], 16) === Stage 12 === ShuffleWriterExec: partitioning: None - SortExec: expr=[nation@0 ASC NULLS LAST, o_year@1 DESC], preserve_partitioning=[true] - ProjectionExec: expr=[nation@0 as nation, o_year@1 as o_year, sum(profit.amount)@2 as sum_profit] + ProjectionExec: expr=[nation@0 as nation, o_year@1 as o_year, sum(profit.amount)@2 as sum_profit] + SortExec: expr=[nation@0 ASC NULLS LAST, o_year@1 DESC], preserve_partitioning=[true] AggregateExec: mode=FinalPartitioned, gby=[nation@0 as nation, o_year@1 as o_year], aggr=[sum(profit.amount)] UnresolvedShuffleExec: stage=11, partitioning: Hash([nation@0, o_year@1], 16) diff --git a/ballista/scheduler/tests/tpch_plan_stability/main.rs b/ballista/scheduler/tests/tpch_plan_stability/main.rs index 38d6d5f2a5..09ea7d7cc8 100644 --- a/ballista/scheduler/tests/tpch_plan_stability/main.rs +++ b/ballista/scheduler/tests/tpch_plan_stability/main.rs @@ -23,6 +23,7 @@ use std::sync::Arc; use datafusion::arrow::datatypes::{DataType, Field, Schema}; use datafusion::common::stats::Precision; +use datafusion::physical_plan::statistics::{StatisticsArgs, StatisticsContext}; use datafusion::prelude::SessionContext; use stats_table::TpchStatsTable; @@ -45,7 +46,9 @@ async fn stats_table_reports_injected_rows() { .await .unwrap(); - let stats = plan.partition_statistics(None).unwrap(); + let stats = StatisticsContext::new() + .compute(plan.as_ref(), &StatisticsArgs::new()) + .unwrap(); assert_eq!(stats.num_rows, Precision::Inexact(12_345)); } diff --git a/benchmarks/src/bin/tpch.rs b/benchmarks/src/bin/tpch.rs index 2f20804d7b..84eb8a582c 100644 --- a/benchmarks/src/bin/tpch.rs +++ b/benchmarks/src/bin/tpch.rs @@ -1203,7 +1203,7 @@ async fn get_table( path: &str, table: &str, table_format: &str, - target_partitions: usize, + _target_partitions: usize, ) -> Result> { let (format, path, extension, schema): ( Arc, @@ -1255,14 +1255,7 @@ async fn get_table( } }; - let options = ListingOptions { - format, - file_extension: extension.to_owned(), - target_partitions, - collect_stat: true, - table_partition_cols: vec![], - file_sort_order: vec![], - }; + let options = ListingOptions::new(format).with_file_extension(extension.to_owned()); let url = ListingTableUrl::parse(path)?; let config = ListingTableConfig::new(url).with_listing_options(options); diff --git a/python/Cargo.lock b/python/Cargo.lock index 1d6d4f4f86..49a856bd5e 100644 --- a/python/Cargo.lock +++ b/python/Cargo.lock @@ -99,9 +99,9 @@ checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" [[package]] name = "arrow" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cfdd0833e32a9874d2b55089333ad310c0be208aafa277385ce2461dec90be3" +checksum = "61d285d16bce7d0be61912f7928342b673067b6b7d7ef6cc179258ba7de1fecf" dependencies = [ "arrow-arith", "arrow-array", @@ -121,9 +121,9 @@ dependencies = [ [[package]] name = "arrow-arith" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a41203398f0eaa6f7ec8e62c0da742a21abf282c148fc157f6c35c90e29981a" +checksum = "757ef1836251e88222542a7da2623bc1c9cb9e20afefa6db2c41e79991cd91d4" dependencies = [ "arrow-array", "arrow-buffer", @@ -135,9 +135,9 @@ dependencies = [ [[package]] name = "arrow-array" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae33dad492b7df00a217563a7b0ef2874df68a0deea1b1a3acf628152f7f7a69" +checksum = "bc9a4a4b2b5ecd0e04df03471661cb61f28bed3c7fd50994715129b01b2edb97" dependencies = [ "ahash", "arrow-buffer", @@ -147,6 +147,7 @@ dependencies = [ "chrono-tz", "half", "hashbrown 0.17.1", + "libc", "num-complex", "num-integer", "num-traits", @@ -154,9 +155,9 @@ dependencies = [ [[package]] name = "arrow-avro" -version = "58.3.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "049230728cd6e093088c8d231b4beede184e35cad7777c1505c0d5a8571f4376" +checksum = "9fb45cd6bd2b25c0965793b83200eaca82214273a8030fbbc2d783e4c7c65a61" dependencies = [ "arrow-array", "arrow-buffer", @@ -178,21 +179,21 @@ dependencies = [ [[package]] name = "arrow-buffer" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9552f96391c005e6ab449fa941420935e7e062489b12b8b1b08879b2163f5b5" +checksum = "c12b576ef18c1deb80925a248b25ad84f419198d791b8e293fc6aaa60441fe90" dependencies = [ "bytes", "half", - "num-bigint", + "num-bigint 0.5.1", "num-traits", ] [[package]] name = "arrow-cast" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a8a327c9649f30d8406995f27642b68df354713cca3baaaf100f076f18d5f34" +checksum = "68338a9096a5dc9bc11927c58c43a8526d96bf6abd2012ef6c0c9f505991cc79" dependencies = [ "arrow-array", "arrow-buffer", @@ -201,7 +202,7 @@ dependencies = [ "arrow-schema", "arrow-select", "atoi", - "base64", + "base64 0.23.1", "chrono", "comfy-table", "half", @@ -212,9 +213,9 @@ dependencies = [ [[package]] name = "arrow-csv" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af0dd6d90d1955e9f9a014c1e563ee8aeffc21909085d25623e1da44d96eca26" +checksum = "25011b52b346407d497ef0030e12b45e4f2d0cc279efc09c4f3d09106db30e36" dependencies = [ "arrow-array", "arrow-cast", @@ -227,9 +228,9 @@ dependencies = [ [[package]] name = "arrow-data" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b24852db04738907e06c04ea61e42fe7fda962a34513022dc0d0e754fb7976b" +checksum = "723fe4aeed7604e00b9883a465af4ff0a0e6c44c03e41a68c3d1cbc403e0e44d" dependencies = [ "arrow-buffer", "arrow-schema", @@ -240,9 +241,9 @@ dependencies = [ [[package]] name = "arrow-flight" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2dbe34824c639e43136af8f106992792ab456540d54b880bc320a3192502d2e" +checksum = "2bebfacc9d71f0728f6774164e4d4254b5e504d2b46812d0512d8290ec119a64" dependencies = [ "arrow-arith", "arrow-array", @@ -255,11 +256,10 @@ dependencies = [ "arrow-schema", "arrow-select", "arrow-string", - "base64", + "base64 0.23.1", "bytes", "futures", "once_cell", - "paste", "prost", "prost-types", "tonic", @@ -268,9 +268,9 @@ dependencies = [ [[package]] name = "arrow-ipc" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29a908a11fcfb3fb2f6730f4ac15e367bc644e419155e96238f68cf3adde572b" +checksum = "149437b14371f5b9ec60f5ddc751483ae99d7a7072653c0075e5e469156eea7b" dependencies = [ "arrow-array", "arrow-buffer", @@ -284,9 +284,9 @@ dependencies = [ [[package]] name = "arrow-json" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a96aed3931c076adee39ec2a40d8219fc7f09e79bcdaca1df16272993e1e14" +checksum = "f18b9123ccfec418a663f821c9a034af339711678c11ffe00d3ec07da5ff9f7e" dependencies = [ "arrow-array", "arrow-buffer", @@ -309,9 +309,9 @@ dependencies = [ [[package]] name = "arrow-ord" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63a083ec750f5c043f02946b4baf05fcdbb55f4560a3277055caca5cc99f3eb0" +checksum = "e6c08dff0686cf23ca4f562803f191ccbeb726dbae6309cd4b4aaf65e0f2c979" dependencies = [ "arrow-array", "arrow-buffer", @@ -322,9 +322,9 @@ dependencies = [ [[package]] name = "arrow-pyarrow" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ffb9be5a873590f825aef50df20e0f8dff5fd42a77058e28bbe7bd44bb53dec" +checksum = "c196ecc25b3a8dcbc1d842f2619cee653dcfa2fb8b56a291bc0481c3cf5c3821" dependencies = [ "arrow-array", "arrow-data", @@ -334,9 +334,9 @@ dependencies = [ [[package]] name = "arrow-row" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514ba0ef0d4c5896202dae736251ce415abb43a950bed570fb7981b8716c0e4c" +checksum = "bbec439386df71ad570e6758a946111322b9e9dc8db83b5527321f0b4c9119c2" dependencies = [ "arrow-array", "arrow-buffer", @@ -347,9 +347,9 @@ dependencies = [ [[package]] name = "arrow-schema" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21ca356ad6425cecb6eb7b28e4f659f1ee7880fbb1a16127de7dd62901efee9e" +checksum = "e6fed2ca0d1eade57e811cbe73b98ad50cc08a1183e13b2d2aa43a7df593f40e" dependencies = [ "bitflags", "serde_core", @@ -358,9 +358,9 @@ dependencies = [ [[package]] name = "arrow-select" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58da39eb3d8350ad4a549e5c2bc49284dac554016c69829310350f1731b0aad" +checksum = "466b19cf75130b891dc1b23a84b343c714c62c64c9c62e365c76aa0ff90a53fb" dependencies = [ "ahash", "arrow-array", @@ -372,9 +372,9 @@ dependencies = [ [[package]] name = "arrow-string" -version = "58.4.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6789b388467525e3271326b6b4915666ecfdf5142aef09779445c954b67543c" +checksum = "c838a25bb3691e919e0f617616ac51a4ff8517a952e29ca133cf0c22b2ce65b1" dependencies = [ "arrow-array", "arrow-buffer", @@ -401,9 +401,9 @@ dependencies = [ [[package]] name = "async-ffi" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4de21c0feef7e5a556e51af767c953f0501f7f300ba785cc99c47bdc8081a50" +checksum = "39cd9de47399986d5b216c6bef9434dfff1689ab61ba8d1e2720dc5fe5c84083" [[package]] name = "async-trait" @@ -413,7 +413,7 @@ checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" dependencies = [ "proc-macro2", "quote", - "syn 3.0.0", + "syn 3.0.3", ] [[package]] @@ -598,6 +598,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + [[package]] name = "bigdecimal" version = "0.4.10" @@ -606,7 +612,7 @@ checksum = "4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695" dependencies = [ "autocfg", "libm", - "num-bigint", + "num-bigint 0.4.8", "num-integer", "num-traits", ] @@ -685,12 +691,6 @@ version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - [[package]] name = "bytes" version = "1.12.1" @@ -714,9 +714,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89588d05638b5b4594a3348a2d6c20277e43a7f5c5202b05cc56888475a47b8" +checksum = "5add81bb678e6cb321aff7fa0dc7689ad82b112dbc032cea19f91d6b8e3582b9" dependencies = [ "find-msvc-tools", "jobserver", @@ -970,9 +970,8 @@ dependencies = [ [[package]] name = "datafusion" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "997a31e15872606a49478e670c58302094c97cb96abb0a7d60720f8e92170040" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-schema", @@ -1008,7 +1007,7 @@ dependencies = [ "flate2", "futures", "indexmap", - "itertools 0.14.0", + "itertools 0.15.0", "liblzma", "log", "object_store", @@ -1024,9 +1023,8 @@ dependencies = [ [[package]] name = "datafusion-catalog" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7dd61161508f8f5fa1107774ea687bd753c22d83a32eebf963549f89de14139" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "async-trait", @@ -1040,7 +1038,7 @@ dependencies = [ "datafusion-physical-plan", "datafusion-session", "futures", - "itertools 0.14.0", + "itertools 0.15.0", "log", "object_store", "parking_lot", @@ -1049,9 +1047,8 @@ dependencies = [ [[package]] name = "datafusion-catalog-listing" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897c70f871277f9ce99aa38347be0d679bbe3e617156c4d2a8378cec8a2a0891" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "async-trait", @@ -1065,16 +1062,16 @@ dependencies = [ "datafusion-physical-expr-common", "datafusion-physical-plan", "futures", - "itertools 0.14.0", + "itertools 0.15.0", "log", "object_store", + "percent-encoding", ] [[package]] name = "datafusion-common" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c9ded5d87d9172319e006f2afdb9928d72dbacd6a90a458d8acb1e3b43a65" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-ipc", @@ -1084,9 +1081,10 @@ dependencies = [ "half", "hashbrown 0.17.1", "indexmap", - "itertools 0.14.0", + "itertools 0.15.0", "libc", "log", + "num-traits", "object_store", "parquet", "recursive", @@ -1098,9 +1096,8 @@ dependencies = [ [[package]] name = "datafusion-common-runtime" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "981b9dae74f78ee3d9f714fb49b01919eab975461b56149510c3ba9ea11287d1" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "futures", "log", @@ -1109,9 +1106,8 @@ dependencies = [ [[package]] name = "datafusion-datasource" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffd7d295b2ec7c00d8a56562f41ed41062cf0af75549ed891c12a0a09eddfefe" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "async-compression", @@ -1127,11 +1123,12 @@ dependencies = [ "datafusion-physical-expr-adapter", "datafusion-physical-expr-common", "datafusion-physical-plan", + "datafusion-proto-models", "datafusion-session", "flate2", "futures", "glob", - "itertools 0.14.0", + "itertools 0.15.0", "liblzma", "log", "object_store", @@ -1145,9 +1142,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-arrow" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552b0b3f342f7ec41b3fbd70f6339dc82a30cfd0349e7f280e7852528085349f" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-ipc", @@ -1162,16 +1158,15 @@ dependencies = [ "datafusion-physical-plan", "datafusion-session", "futures", - "itertools 0.14.0", + "itertools 0.15.0", "object_store", "tokio", ] [[package]] name = "datafusion-datasource-avro" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb517d08967d536284ce70afb5fe8583133779249f2d7b90587d339741a7f195" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-avro", @@ -1188,9 +1183,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-csv" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68850aa426b897e879c8b87e512ea8124f1d0a2869a4e51808ddaaddf1bc0ada" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "async-trait", @@ -1202,6 +1196,7 @@ dependencies = [ "datafusion-expr", "datafusion-physical-expr-common", "datafusion-physical-plan", + "datafusion-proto-models", "datafusion-session", "futures", "object_store", @@ -1211,9 +1206,8 @@ dependencies = [ [[package]] name = "datafusion-datasource-json" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402f93242ae08ef99139ee2c528a49d087efe88d5c7b2c3ff5480855a40ce54f" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "async-trait", @@ -1225,6 +1219,7 @@ dependencies = [ "datafusion-expr", "datafusion-physical-expr-common", "datafusion-physical-plan", + "datafusion-proto-models", "datafusion-session", "futures", "object_store", @@ -1234,11 +1229,11 @@ dependencies = [ [[package]] name = "datafusion-datasource-parquet" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffd2499c1bee0eeccf6a57156105700eeeb17bc701899ac719183c4e74231450" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", + "arrow-schema", "async-trait", "bytes", "datafusion-common", @@ -1252,10 +1247,11 @@ dependencies = [ "datafusion-physical-expr-adapter", "datafusion-physical-expr-common", "datafusion-physical-plan", + "datafusion-proto-models", "datafusion-pruning", "datafusion-session", "futures", - "itertools 0.14.0", + "itertools 0.15.0", "log", "object_store", "parking_lot", @@ -1265,19 +1261,18 @@ dependencies = [ [[package]] name = "datafusion-doc" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb9e7e5d11130c48c8bd4e80c79a9772dd28ce6dc330baca9246205d245b9e2e" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" [[package]] name = "datafusion-execution" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a8643ab852eb68864e1b72ae789e8066282dce48eea6347ffb0aee33d1ccc0" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-buffer", "async-trait", + "bytes", "dashmap", "datafusion-common", "datafusion-expr", @@ -1286,16 +1281,18 @@ dependencies = [ "log", "object_store", "parking_lot", + "pin-project-lite", "rand 0.9.5", "tempfile", + "tokio", + "tokio-util", "url", ] [[package]] name = "datafusion-expr" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6932f4d71eed9c8d9341476a2b845aadfabde5495d08dbcd8fc23881f49fa7a0" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-schema", @@ -1308,7 +1305,7 @@ dependencies = [ "datafusion-functions-window-common", "datafusion-physical-expr-common", "indexmap", - "itertools 0.14.0", + "itertools 0.15.0", "recursive", "serde_json", "sqlparser", @@ -1316,21 +1313,19 @@ dependencies = [ [[package]] name = "datafusion-expr-common" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0225491839a31b1f7d2cb8092c2d50792e2fe1c1724e4e6d08e011f5feaf4ed2" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", "indexmap", - "itertools 0.14.0", + "itertools 0.15.0", ] [[package]] name = "datafusion-ffi" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5660e8fa79fd51e29ce46f3026b67317ef738ebd633e106beb1a1907a406152" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-schema", @@ -1361,13 +1356,12 @@ dependencies = [ [[package]] name = "datafusion-functions" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14872c47bfc3d21e53ec82f57074e6987a15941c1e2f43cde4ac6ae2746634e3" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-buffer", - "base64", + "base64 0.23.1", "blake2", "blake3", "chrono", @@ -1380,7 +1374,7 @@ dependencies = [ "datafusion-macros", "datafusion-physical-expr-common", "hex", - "itertools 0.14.0", + "itertools 0.15.0", "log", "md-5 0.11.0", "memchr", @@ -1393,9 +1387,8 @@ dependencies = [ [[package]] name = "datafusion-functions-aggregate" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a2ca14e1b609be21e657e2d3130b2f446456b08393b377bb721a33952d2e09" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", @@ -1406,17 +1399,16 @@ dependencies = [ "datafusion-macros", "datafusion-physical-expr", "datafusion-physical-expr-common", - "foldhash 0.2.0", "half", + "hashbrown 0.17.1", "log", "num-traits", ] [[package]] name = "datafusion-functions-aggregate-common" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ece74ba09092d2ef9c9b54a38445450aea292a1f8b04faf531936b723a24b3c" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", @@ -1426,9 +1418,8 @@ dependencies = [ [[package]] name = "datafusion-functions-nested" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3e3f9ee8ca59bf70518802107de6f1b88a9509efdc629fadc5de9d6b2d5ef5" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-ord", @@ -1443,7 +1434,7 @@ dependencies = [ "datafusion-macros", "datafusion-physical-expr-common", "hashbrown 0.17.1", - "itertools 0.14.0", + "itertools 0.15.0", "itoa", "log", "memchr", @@ -1451,9 +1442,8 @@ dependencies = [ [[package]] name = "datafusion-functions-table" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89161dffc22cf2b50f9f4b1bee83b5221d3b4ed7c2e37fd7aa2b22a5297b3a26" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "async-trait", @@ -1467,9 +1457,8 @@ dependencies = [ [[package]] name = "datafusion-functions-window" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7339345b226b3874037708bf5023ba1c2de705128f8457a095aae5ae9cb9c78" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", @@ -1484,9 +1473,8 @@ dependencies = [ [[package]] name = "datafusion-functions-window-common" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa84836dc2392df6f43d6a29d37fb56a8ebdc8b3f4e10ae8dc15861fd20278fb" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "datafusion-common", "datafusion-physical-expr-common", @@ -1494,20 +1482,18 @@ dependencies = [ [[package]] name = "datafusion-macros" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "587164e03ad68732aa9e7bfe5686e3f25970d4c64fd4bd80790749840892dae5" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "datafusion-doc", "quote", - "syn 2.0.119", + "syn 3.0.3", ] [[package]] name = "datafusion-optimizer" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77f20e8cf9e8654d92f4c16b24c487353ee5bf153ffc12d5772cd399ab8cd281" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "chrono", @@ -1516,7 +1502,7 @@ dependencies = [ "datafusion-expr-common", "datafusion-physical-expr", "indexmap", - "itertools 0.14.0", + "itertools 0.15.0", "log", "recursive", "regex", @@ -1525,9 +1511,8 @@ dependencies = [ [[package]] name = "datafusion-physical-expr" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f015a4a82f6f7ff7e1d8d4bf3870a936752fa38b17705dfcc14adef95aa8922c" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", @@ -1535,10 +1520,11 @@ dependencies = [ "datafusion-expr-common", "datafusion-functions-aggregate-common", "datafusion-physical-expr-common", + "datafusion-proto-models", "half", "hashbrown 0.17.1", "indexmap", - "itertools 0.14.0", + "itertools 0.15.0", "parking_lot", "petgraph", "recursive", @@ -1547,9 +1533,8 @@ dependencies = [ [[package]] name = "datafusion-physical-expr-adapter" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e6ffff8acdfe54e0ea15ccf38115c4a9184433b0439f42907637928d00a235" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", @@ -1557,31 +1542,30 @@ dependencies = [ "datafusion-functions", "datafusion-physical-expr", "datafusion-physical-expr-common", - "itertools 0.14.0", + "itertools 0.15.0", ] [[package]] name = "datafusion-physical-expr-common" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7967a3e171c6a4bf09474b3f7a14f1a3db13ed1714ba12156f33fcce2bba54e8" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "chrono", "datafusion-common", "datafusion-expr-common", + "datafusion-proto-models", "hashbrown 0.17.1", "indexmap", - "itertools 0.14.0", + "itertools 0.15.0", "parking_lot", "pin-project", ] [[package]] name = "datafusion-physical-optimizer" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ff803e2a96054cb6d83f35f9e60fd4f42eac515e1932bd1b2dbc91d5fcbf36" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", @@ -1592,15 +1576,15 @@ dependencies = [ "datafusion-physical-expr-common", "datafusion-physical-plan", "datafusion-pruning", - "itertools 0.14.0", + "datafusion-session", + "itertools 0.15.0", "recursive", ] [[package]] name = "datafusion-physical-plan" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "776ee54d47d15bdb126452f9ca17b03761e3b004682914beaedd3f86eb507fbc" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "arrow-data", @@ -1608,6 +1592,7 @@ dependencies = [ "arrow-ord", "arrow-schema", "async-trait", + "bytes", "datafusion-common", "datafusion-common-runtime", "datafusion-execution", @@ -1617,23 +1602,25 @@ dependencies = [ "datafusion-functions-window-common", "datafusion-physical-expr", "datafusion-physical-expr-common", + "datafusion-proto-common", + "datafusion-proto-models", "futures", "half", "hashbrown 0.17.1", "indexmap", - "itertools 0.14.0", + "itertools 0.15.0", "log", "num-traits", "parking_lot", "pin-project-lite", + "serde_json", "tokio", ] [[package]] name = "datafusion-proto" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd15a1ba5d3af93808241065c6c44dbca8296a189845e8a587c45c07bf0ffae" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "chrono", @@ -1652,26 +1639,34 @@ dependencies = [ "datafusion-physical-expr-common", "datafusion-physical-plan", "datafusion-proto-common", + "datafusion-proto-models", "object_store", "prost", ] [[package]] name = "datafusion-proto-common" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90042982cf9462eb06a0b81f92efa4188dae871e7ea3ab8dc61aa9c9349b2530" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", "prost", ] +[[package]] +name = "datafusion-proto-models" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" +dependencies = [ + "datafusion-proto-common", + "prost", +] + [[package]] name = "datafusion-pruning" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fb9e5774660aa69c3ba93c610f175f75b65cb8c3776edb3626de8f3a4f4ee3" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "datafusion-common", @@ -1686,8 +1681,7 @@ dependencies = [ [[package]] name = "datafusion-python" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b5da6aab44da83d488e6fb05855f5cd4480c7ab6b44f164166b495cba9fbbb8" +source = "git+https://github.com/apache/datafusion-python.git?rev=f1526210338d75ef105246e5c948e0e4a4a0f5ce#f1526210338d75ef105246e5c948e0e4a4a0f5ce" dependencies = [ "arrow", "arrow-select", @@ -1698,6 +1692,7 @@ dependencies = [ "datafusion-ffi", "datafusion-proto", "datafusion-python-util", + "datafusion-session", "datafusion-spark", "futures", "log", @@ -1707,7 +1702,7 @@ dependencies = [ "prost-types", "pyo3", "pyo3-async-runtimes", - "pyo3-build-config 0.28.3", + "pyo3-build-config", "pyo3-log", "serde_json", "tokio", @@ -1718,8 +1713,7 @@ dependencies = [ [[package]] name = "datafusion-python-util" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba491c15adfebc9ae53aa11f65231814b5199627e9815e2fb62d2f81f4a17fb2" +source = "git+https://github.com/apache/datafusion-python.git?rev=f1526210338d75ef105246e5c948e0e4a4a0f5ce#f1526210338d75ef105246e5c948e0e4a4a0f5ce" dependencies = [ "arrow", "datafusion", @@ -1732,10 +1726,10 @@ dependencies = [ [[package]] name = "datafusion-session" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15ce715fa2a61f4623cc234bcc14a3ef6a91f189128d5b14b468a6a17cdfc417" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ + "arrow-schema", "async-trait", "datafusion-common", "datafusion-execution", @@ -1746,14 +1740,14 @@ dependencies = [ [[package]] name = "datafusion-spark" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390bb0bf37cb2b95ffd65eacd66f60df50793d1f94097799e416f39477a51957" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "bigdecimal", "chrono", "crc32fast", + "datafusion", "datafusion-catalog", "datafusion-common", "datafusion-execution", @@ -1775,9 +1769,8 @@ dependencies = [ [[package]] name = "datafusion-sql" -version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6094ad36a3ed6d7ac87b20b479b2d0b118250f66cf997603829fdc65b44a7099" +version = "54.1.0" +source = "git+https://github.com/apache/datafusion.git?rev=e08aed1e5de41dcf81d529140dae07723b942a5e#e08aed1e5de41dcf81d529140dae07723b942a5e" dependencies = [ "arrow", "bigdecimal", @@ -1790,6 +1783,7 @@ dependencies = [ "recursive", "regex", "sqlparser", + "stacker", ] [[package]] @@ -1827,9 +1821,9 @@ dependencies = [ [[package]] name = "either" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d" [[package]] name = "encode_unicode" @@ -1855,9 +1849,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "find-msvc-tools" @@ -2058,9 +2052,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" [[package]] name = "h2" @@ -2193,9 +2187,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +checksum = "d22053281f852e11534f5198498373cbb59295120a20771d90f7ed1897490a72" dependencies = [ "atomic-waker", "bytes", @@ -2248,7 +2242,7 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-channel", "futures-util", @@ -2414,12 +2408,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "integer-encoding" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" - [[package]] name = "ipnet" version = "2.12.0" @@ -2536,9 +2524,9 @@ checksum = "34b357333733e8260735ba5894eb928c02ecc69c78715f01a8019e7fa7f2db4c" [[package]] name = "libc" -version = "0.2.186" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libloading" @@ -2620,9 +2608,9 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "lz4_flex" -version = "0.13.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef0d4ed8669f8f8826eb00dc878084aa8f253506c4fd5e8f58f5bce72ddb97e" +checksum = "ecbdfe44b1bd960b68170b417450a628c43f7cf56bb3c5317e61cb230ee7f226" dependencies = [ "twox-hash", ] @@ -2721,6 +2709,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-bigint" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-complex" version = "0.4.6" @@ -2784,7 +2782,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622acbc9100d3c10e2ee15804b0caa40e55c933d5aa53814cd520805b7958a49" dependencies = [ "async-trait", - "base64", + "base64 0.22.1", "bytes", "chrono", "form_urlencoded", @@ -2829,15 +2827,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" -[[package]] -name = "ordered-float" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" -dependencies = [ - "num-traits", -] - [[package]] name = "parking_lot" version = "0.12.5" @@ -2863,9 +2852,9 @@ dependencies = [ [[package]] name = "parquet" -version = "58.3.0" +version = "59.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dafa7d01085b62a47dd0c1829550a0a36710ea9c4fe358a05a85477cec8a908" +checksum = "7065842956a20c2a536924ce8e4d9955f7422451511b9eb7500d7bfe5077e59c" dependencies = [ "ahash", "arrow-array", @@ -2874,7 +2863,7 @@ dependencies = [ "arrow-ipc", "arrow-schema", "arrow-select", - "base64", + "base64 0.23.1", "brotli", "bytes", "chrono", @@ -2883,26 +2872,18 @@ dependencies = [ "half", "hashbrown 0.17.1", "lz4_flex", - "num-bigint", + "num-bigint 0.5.1", "num-integer", "num-traits", "object_store", - "paste", "seq-macro", "simdutf8", "snap", - "thrift", "tokio", "twox-hash", "zstd", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "percent-encoding" version = "2.3.2" @@ -3016,9 +2997,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] @@ -3116,35 +3097,37 @@ dependencies = [ "ballista-executor", "ballista-scheduler", "datafusion", + "datafusion-ffi", "datafusion-proto", "datafusion-python", "log", "pyo3", - "pyo3-build-config 0.29.1", + "pyo3-build-config", "pyo3-log", "tokio", "tonic", + "url", ] [[package]] name = "pyo3" -version = "0.28.3" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fd8e38a3b50ed1167fb981cd6fd60147e091784c427b8f7183a7ee32c31c12" +checksum = "4688ddedf473e32662b9b067670129a8afb8c18e351482c70d62ba4a88171e8b" dependencies = [ "libc", "once_cell", "portable-atomic", - "pyo3-build-config 0.28.3", + "pyo3-build-config", "pyo3-ffi", "pyo3-macros", ] [[package]] name = "pyo3-async-runtimes" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e7364a95bf00e8377bbf9b0f09d7ff9715a29d8fcf93b47d1a967363b973178" +checksum = "b3ef68daa7316a3fac65e5e18b2203f010346de1c1c53456811a2624673ab046" dependencies = [ "futures-channel", "futures-util", @@ -3156,31 +3139,21 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.28.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e368e7ddfdeb98c9bca7f8383be1648fd84ab466bf2bc015e94008db6d35611e" -dependencies = [ - "python3-dll-a", - "target-lexicon", -] - -[[package]] -name = "pyo3-build-config" -version = "0.29.1" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb77d9aa6d647507b55c69ee714d266d84c526c78ff0bc6dd8757f58591e64d1" +checksum = "f41027e41b4bd03f6e60f9f417fe24a6341a6bb744edd62b6f709f2a52ea30e9" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" -version = "0.28.3" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f29e10af80b1f7ccaf7f69eace800a03ecd13e883acfacc1e5d0988605f651e" +checksum = "e591a95526fead067432c3b3a33fc74770b87b1e04e73671090d9c2055a2b327" dependencies = [ "libc", - "pyo3-build-config 0.28.3", + "pyo3-build-config", ] [[package]] @@ -3196,9 +3169,9 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.28.3" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df6e520eff47c45997d2fc7dd8214b25dd1310918bbb2642156ef66a67f29813" +checksum = "73225868fc1cd84eef2c3c230ddb91273bf1de46aeb8a4248da76d32a0924a1c" dependencies = [ "proc-macro2", "pyo3-macros-backend", @@ -3208,26 +3181,16 @@ dependencies = [ [[package]] name = "pyo3-macros-backend" -version = "0.28.3" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cdc218d835738f81c2338f822078af45b4afdf8b2e33cbb5916f108b813acb" +checksum = "571575aa3749fa6216757dd47d2a3e7ef360f329a40f0666a9fbd14889024952" dependencies = [ "heck", "proc-macro2", - "pyo3-build-config 0.28.3", "quote", "syn 2.0.119", ] -[[package]] -name = "python3-dll-a" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d80ba7540edb18890d444c5aa8e1f1f99b1bdf26fb26ae383135325f4a36042b" -dependencies = [ - "cc", -] - [[package]] name = "quick-xml" version = "0.39.4" @@ -3296,9 +3259,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.46" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -3434,7 +3397,7 @@ version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-core", "futures-util", @@ -3540,9 +3503,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" dependencies = [ "web-time", "zeroize", @@ -3657,15 +3620,16 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.0", + "syn 3.0.3", ] [[package]] name = "serde_json" -version = "1.0.150" +version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ + "indexmap", "itoa", "memchr", "serde", @@ -3816,9 +3780,9 @@ dependencies = [ [[package]] name = "stabby" -version = "72.1.8" +version = "72.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7b834ec7ced12095fea1e4b07dcb7e8cf2b59b18afa3eac52494d835965a5ec" +checksum = "3d53d2428934c46277fafd2d41e39357595aa1e47954c75db2b14ed90632f3cc" dependencies = [ "rustversion", "stabby-abi", @@ -3826,9 +3790,9 @@ dependencies = [ [[package]] name = "stabby-abi" -version = "72.1.8" +version = "72.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1a4f477858a5bdf927c9fab7f579899de9b13e39f8b3b3b300c89fbab632f4" +checksum = "f375eae680bb54203ee5e47d4cd2ae7b79c0a79ed90919279f38f500ad53f190" dependencies = [ "rustc_version", "rustversion", @@ -3838,9 +3802,9 @@ dependencies = [ [[package]] name = "stabby-macros" -version = "72.1.8" +version = "72.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b31c4b2434980b67ad83f300a58088ba14d59454dcd79ba3d87419bbd924d31e" +checksum = "ea664671a576c5f7e32fee291ac123d82af5e92b0689beb3555347c00c76eef1" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3898,9 +3862,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.0" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fac314a64dc9a36e61a9eb4261a5e9bbfbc922b27e518af97bc32b926cf967" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" dependencies = [ "proc-macro2", "quote", @@ -3977,18 +3941,7 @@ checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd" dependencies = [ "proc-macro2", "quote", - "syn 3.0.0", -] - -[[package]] -name = "thrift" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09" -dependencies = [ - "byteorder", - "integer-encoding", - "ordered-float", + "syn 3.0.3", ] [[package]] @@ -4077,13 +4030,14 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" dependencies = [ "bytes", "futures-core", "futures-sink", + "libc", "pin-project-lite", "tokio", ] @@ -4126,7 +4080,7 @@ checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef" dependencies = [ "async-trait", "axum", - "base64", + "base64 0.22.1", "bytes", "h2", "http", @@ -4290,11 +4244,11 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "twox-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" +checksum = "8464ec13c3691491391d9fce00f6416c9a48e46972f72d7865688be2080192c9" dependencies = [ - "rand 0.9.5", + "rand 0.10.2", ] [[package]] @@ -4768,18 +4722,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.54" +version = "0.8.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19" +checksum = "b5a105cd7b140f6eeec8acff2ea38135d3cab283ada58540f629fe51e46696eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.54" +version = "0.8.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5" +checksum = "0fe976fb70c78cd64cccfe3a6fc142244e8a77b70959b30faf9d0ac37ee228eb" dependencies = [ "proc-macro2", "quote", diff --git a/python/Cargo.toml b/python/Cargo.toml index 0712605831..3f45c53648 100644 --- a/python/Cargo.toml +++ b/python/Cargo.toml @@ -35,14 +35,16 @@ ballista = { path = "../ballista/client", version = "54.0.0" } ballista-core = { path = "../ballista/core", version = "54.0.0" } ballista-executor = { path = "../ballista/executor", version = "54.0.0", default-features = false } ballista-scheduler = { path = "../ballista/scheduler", version = "54.0.0", default-features = false } -datafusion = { version = "54", features = ["avro"] } -datafusion-proto = { version = "54" } -datafusion-python = { version = "54", default-features = false } +datafusion = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e", features = ["avro"] } +datafusion-ffi = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-proto = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-python = { git = "https://github.com/apache/datafusion-python.git", rev = "f1526210338d75ef105246e5c948e0e4a4a0f5ce", default-features = false } log = { version = "0.4" } -pyo3 = { version = "0.28", features = ["extension-module", "abi3", "abi3-py310"] } +pyo3 = { version = "0.29", features = ["extension-module", "abi3", "abi3-py310"] } pyo3-log = "0.13" tokio = { version = "1.48", features = ["macros", "rt", "rt-multi-thread", "sync"] } tonic = { version = "0.14" } +url = { version = "2.5" } [lib] crate-type = ["cdylib"] @@ -50,3 +52,18 @@ name = "ballista" [build-dependencies] pyo3-build-config = "0.29" + +# datafusion-python's workspace patch does not apply when it is consumed as a +# dependency. Repeat its exact DataFusion patch here so the standalone Python +# crate uses one ABI-compatible DataFusion source family. +[patch.crates-io] +datafusion = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-catalog = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-common = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-expr = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-ffi = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-functions-aggregate = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-functions-window = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-proto = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-session = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } +datafusion-spark = { git = "https://github.com/apache/datafusion.git", rev = "e08aed1e5de41dcf81d529140dae07723b942a5e" } diff --git a/python/examples/getting_started.ipynb b/python/examples/getting_started.ipynb index b2f725cbab..60eb5c3dd1 100644 --- a/python/examples/getting_started.ipynb +++ b/python/examples/getting_started.ipynb @@ -58,7 +58,12 @@ "outputs": [], "source": [ "import ballista\n", - "from ballista import BallistaSessionContext, setup_test_cluster\n", + "from ballista import (\n", + " BallistaExtension,\n", + " ballista_datafusion_config_defaults,\n", + " setup_test_cluster,\n", + ")\n", + "from datafusion import SessionConfig, SessionContext\n", "%load_ext autoreload\n", "%autoreload 2\n", "\n", @@ -77,10 +82,25 @@ "# ctx = BallistaSessionContext(\"df://your-scheduler:50050\")\n", "\n", "host, port = setup_test_cluster()\n", - "ctx = BallistaSessionContext(f\"df://{host}:{port}\")\n", + "address = f\"df://{host}:{port}\"\n", + "\n", + "ballista_config = ballista_datafusion_config_defaults()\n", + "ctx = SessionContext(SessionConfig(ballista_config)).with_extensions(\n", + " BallistaExtension(address)\n", + ")\n", "\n", "print(f\"Connected to Ballista at {host}:{port}\")\n", - "print(f\"Session ID: {ctx.session_id}\")" + "print(f\"Session ID: {ctx.session_id()}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ctx.deregister_table(\"public.test_data_v1\")\n", + "ctx.deregister_table(\"public.test_data_v2\")" ] }, { @@ -94,7 +114,7 @@ "ctx.register_parquet(\"public.test_data_v2\", \"../testdata/test.parquet\")\n", "\n", "# List registered tables\n", - "print(\"Registered schemas and tables:\\n\", ctx.get_tables())" + "print(\"Registered schemas and tables:\\n\", ctx.catalog().schema().table_names())" ] }, { @@ -321,7 +341,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.3" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/python/pyproject.toml b/python/pyproject.toml index 081c504b4d..dbc82006cf 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -41,7 +41,8 @@ classifiers = [ ] dependencies = [ "pyarrow>=23.0.1", - "datafusion==54", + # Temporary PR #1679 pin. Use its released version before publishing. + "datafusion @ git+https://github.com/apache/datafusion-python.git@f1526210338d75ef105246e5c948e0e4a4a0f5ce", "typing-extensions;python_version<'3.13'", ] dynamic = ["version"] diff --git a/python/python/ballista/__init__.py b/python/python/ballista/__init__.py index 5a5ef7bb02..97ba8ef657 100644 --- a/python/python/ballista/__init__.py +++ b/python/python/ballista/__init__.py @@ -21,8 +21,13 @@ import importlib_metadata from ._internal_ballista import ( - BallistaScheduler, BallistaExecutor, + BallistaExtension, + BallistaLogicalExtensionCodec, + BallistaPhysicalExtensionCodec, + BallistaQueryPlanner, + BallistaScheduler, + ballista_datafusion_config_defaults, setup_test_cluster, ) from .extension import ( @@ -35,8 +40,13 @@ __all__ = [ "setup_test_cluster", + "ballista_datafusion_config_defaults", "BallistaScheduler", "BallistaExecutor", + "BallistaExtension", + "BallistaLogicalExtensionCodec", + "BallistaPhysicalExtensionCodec", + "BallistaQueryPlanner", "BallistaSessionContext", "DistributedDataFrame", "ExecutionPlanVisualization", diff --git a/python/python/ballista/extension.py b/python/python/ballista/extension.py index 645c99518a..3455da013a 100644 --- a/python/python/ballista/extension.py +++ b/python/python/ballista/extension.py @@ -26,7 +26,9 @@ from typing import Dict, List, Union, Optional, Callable import warnings +from ._internal_ballista import ballista_datafusion_config_defaults from ._internal_ballista import create_ballista_data_frame +from ._internal_ballista import with_ballista_query_planner from ._internal_ballista import ParquetColumnOptions as ParquetColumnOptionsInternal from ._internal_ballista import ParquetWriterOptions as ParquetWriterOptionsInternal @@ -53,9 +55,9 @@ def __new__(cls, name, bases, attrs): def __wrap_dataframe_execution(func): def method_wrapper(*args, **kwargs): slf, *argz = args - df = slf._to_internal_df() - - return getattr(df, func)(*argz, **kwargs) + # The DataFrame already carries the FFI-installed Ballista + # planner, so normal terminal operations execute it directly. + return getattr(DataFrame, func)(slf, *argz, **kwargs) return method_wrapper @@ -66,7 +68,12 @@ def method_wrapper(*args, **kwargs): address = args[0].address session_id = args[0].session_id df = func(*args, **kwargs) - return DistributedDataFrame(df, session_id, address) + return DistributedDataFrame( + df, + session_id, + address, + args[0].cluster_config, + ) return method_wrapper @@ -531,6 +538,9 @@ def __repr__(self) -> str: return f"ExecutionPlanVisualization(analyze={self.analyze})\n{self.plan_str}" +# Keep the compatibility wrapper for write_* methods because DataFusion's +# logical codec FFI does not yet transport the file-format factories used by COPY. +# Normal terminal operations execute through the installed FFI planner. class BallistaSessionContext(SessionContext, metaclass=RedefiningSessionContextMeta): """ A session context for connecting to and querying a Ballista cluster. @@ -571,20 +581,17 @@ def __init__( if cluster_config is not None else None ) - # Apply overrides to the local SessionContext too: some settings - # (e.g. datafusion.execution.listing_table_factory_infer_partitions) - # are consulted during local table registration / planning, before - # the plan is shipped to the scheduler. Ballista-namespaced keys - # are not understood by the local SessionConfig and are forwarded - # to the scheduler only. - if self.cluster_config: - if config is None: - config = SessionConfig() - for key, value in self.cluster_config.items(): - if key.startswith("ballista."): - continue + if config is None: + config = SessionConfig() + for key, value in ballista_datafusion_config_defaults().items(): config = config.set(key, value) - super().__init__(config, runtime) + source_ctx = SessionContext(config, runtime) + configured_ctx = with_ballista_query_planner( + source_ctx, + address, + self.cluster_config, + ) + self.ctx = configured_ctx.ctx self.address = address self.session_id_internal = super().session_id() diff --git a/python/python/tests/test_context.py b/python/python/tests/test_context.py index 6e51803784..ab8a2a7598 100644 --- a/python/python/tests/test_context.py +++ b/python/python/tests/test_context.py @@ -15,9 +15,27 @@ # specific language governing permissions and limitations # under the License. -from ballista import BallistaSessionContext, setup_test_cluster -from ballista.extension import DataFrame, DistributedDataFrame, SessionContext -from datafusion import col, lit +import gc + +from ballista import ( + BallistaExtension, + BallistaLogicalExtensionCodec, + BallistaPhysicalExtensionCodec, + BallistaQueryPlanner, + BallistaSessionContext, + setup_test_cluster, +) +from ballista._internal_ballista import ( + ballista_datafusion_config_defaults, + with_ballista_query_planner, +) +from ballista.extension import ( + DataFrame, + DistributedDataFrame, + SessionConfig, +) +from datafusion import SessionContext, col, lit +import ctypes import pytest import pyarrow as pa @@ -28,14 +46,136 @@ def ctx(): return BallistaSessionContext(address=f"df://{address}:{port}") +def assert_uses_ballista(df): + assert "DistributedQueryExec" in str(df.execution_plan()) + + +def test_ballista_ffi_capsules_use_current_datafusion_abi(): + source_ctx = SessionContext() + logical_codec = BallistaLogicalExtensionCodec(source_ctx) + physical_codec = BallistaPhysicalExtensionCodec(source_ctx, logical_codec) + planner = BallistaQueryPlanner("df://localhost:50050", source_ctx) + is_valid = ctypes.pythonapi.PyCapsule_IsValid + is_valid.argtypes = [ctypes.py_object, ctypes.c_char_p] + is_valid.restype = ctypes.c_int + + capsules = { + b"datafusion_logical_extension_codec": ( + logical_codec.__datafusion_logical_extension_codec__() + ), + b"datafusion_physical_extension_codec": ( + physical_codec.__datafusion_physical_extension_codec__() + ), + b"datafusion_query_planner": planner.__datafusion_query_planner__(), + } + for name, capsule in capsules.items(): + assert is_valid(capsule, name) == 1 + + assert not hasattr(logical_codec, "__datafusion_physical_extension_codec__") + assert not hasattr(physical_codec, "__datafusion_logical_extension_codec__") + assert not hasattr(planner, "__datafusion_logical_extension_codec__") + assert not hasattr(planner, "__datafusion_physical_extension_codec__") + + +def test_manual_query_planner_and_codec_composition(): + address, port = setup_test_cluster() + source_ctx = SessionContext() + source_ctx.register_csv("registered", "testdata/test.csv", has_header=True) + logical_codec = BallistaLogicalExtensionCodec(source_ctx) + physical_codec = BallistaPhysicalExtensionCodec(source_ctx, logical_codec) + planner = BallistaQueryPlanner(f"df://{address}:{port}", source_ctx) + + configured_ctx = source_ctx.with_logical_extension_codec(logical_codec) + configured_ctx = configured_ctx.with_physical_extension_codec(physical_codec) + configured_ctx = configured_ctx.with_query_planner(planner) + + df = configured_ctx.sql("SELECT COUNT(*) FROM registered") + assert type(df) is DataFrame + assert_uses_ballista(df) + assert df.collect()[0].column(0).to_pylist() == [5] + + +def test_ballista_extension_uses_atomic_context_installation(): + address, port = setup_test_cluster() + source_ctx = SessionContext() + source_ctx.register_csv("registered", "testdata/test.csv", has_header=True) + + configured_ctx = source_ctx.with_extensions( + BallistaExtension(f"df://{address}:{port}") + ) + + df = configured_ctx.sql("SELECT COUNT(*) FROM registered") + assert type(df) is DataFrame + assert_uses_ballista(df) + assert df.collect()[0].column(0).to_pylist() == [5] + + +def test_ballista_extension_context_must_outlive_dataframe(): + address, port = setup_test_cluster() + configured_ctx = SessionContext().with_extensions( + BallistaExtension(f"df://{address}:{port}") + ) + df = configured_ctx.sql("SELECT 1") + + del configured_ctx + gc.collect() + + with pytest.raises(Exception, match="went out of scope"): + df.collect() + + +def test_low_level_helper_returns_standard_distributed_dataframe(): + address, port = setup_test_cluster() + source_ctx = SessionContext() + source_ctx.register_csv("registered", "testdata/test.csv", has_header=True) + configured_ctx = with_ballista_query_planner( + source_ctx, + f"df://{address}:{port}", + {"datafusion.execution.target_partitions": "7"}, + ) + + assert type(configured_ctx) is SessionContext + assert "datafusion.execution.target_partitions = 7" in str(source_ctx) + assert "datafusion.execution.target_partitions = 7" in str(configured_ctx) + df = configured_ctx.sql("SELECT COUNT(*) FROM registered") + assert type(df) is DataFrame + assert_uses_ballista(df) + assert df.collect()[0].column(0).to_pylist() == [5] + + +def test_ballista_datafusion_defaults_are_applied(ctx): + config_text = str(ctx) + + for key, value in ballista_datafusion_config_defaults().items(): + assert f"{key} = {value}" in config_text + + +def test_caller_session_config_is_not_overwritten(): + key = "datafusion.execution.target_partitions" + config = SessionConfig().set(key, "7") + ctx = BallistaSessionContext("df://localhost:50050", config=config) + + assert f"{key} = 7" in str(ctx) + + override_config = SessionConfig().set(key, "7") + override_ctx = BallistaSessionContext( + "df://localhost:50050", + config=override_config, + cluster_config={key: "8"}, + ) + assert f"{key} = 8" in str(override_ctx) + + def test_select_one(ctx): df = ctx.sql("SELECT 1") + assert_uses_ballista(df) batches = df.collect() assert len(batches) == 1 def test_read_csv(ctx): df = ctx.read_csv("testdata/test.csv", has_header=True) + assert_uses_ballista(df) batches = df.collect() assert len(batches) == 1 assert len(batches[0]) == 5 @@ -44,6 +184,7 @@ def test_read_csv(ctx): def test_register_csv(ctx): ctx.register_csv("test", "testdata/test.csv", has_header=True) df = ctx.sql("SELECT * FROM test") + assert_uses_ballista(df) batches = df.collect() assert len(batches) == 1 assert len(batches[0]) == 5 @@ -51,6 +192,7 @@ def test_register_csv(ctx): def test_read_parquet(ctx): df = ctx.read_parquet("testdata/test.parquet") + assert_uses_ballista(df) batches = df.collect() assert len(batches) == 1 assert len(batches[0]) == 8 @@ -59,6 +201,7 @@ def test_read_parquet(ctx): def test_register_parquet(ctx): ctx.register_parquet("test", "testdata/test.parquet") df = ctx.sql("SELECT * FROM test") + assert_uses_ballista(df) batches = df.collect() assert len(batches) == 1 assert len(batches[0]) == 8 @@ -70,6 +213,7 @@ def test_read_dataframe_api(ctx): .select("a", "b") .filter(col("a") > lit(2)) ) + assert_uses_ballista(df) result = df.collect()[0] assert result.column(0) == pa.array([3, 4, 5]) @@ -92,6 +236,8 @@ def test_cluster_config_propagates_to_distributed_dataframe(): df = ctx.sql("SELECT 1") assert df.cluster_config == overrides + assert_uses_ballista(df) + assert len(df.collect()) == 1 def test_cluster_config_accepts_ballista_namespaced_keys(): @@ -114,9 +260,18 @@ def test_cluster_config_accepts_ballista_namespaced_keys(): df = ctx.sql("SELECT 1") assert df.cluster_config == overrides + assert_uses_ballista(df) assert len(df.collect()) == 1 +def test_malformed_scheduler_url_fails_lazily(): + ctx = BallistaSessionContext(address="not a scheduler URL") + ctx.register_csv("test", "testdata/test.csv", has_header=True) + + with pytest.raises(Exception, match="relative URL without a base"): + ctx.sql("SELECT * FROM test").collect() + + def test_write_csv(ctx, tmp_path): df = ctx.read_csv("testdata/test.csv", has_header=True) out_dir = str(tmp_path / "out") diff --git a/python/requirements.txt b/python/requirements.txt index bc9cfb34d9..ae3a415c68 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -1,4 +1,4 @@ -datafusion==52.0.0 +datafusion @ git+https://github.com/apache/datafusion-python.git@f1526210338d75ef105246e5c948e0e4a4a0f5ce pyarrow pytest maturin>=1.8.0,<2.0.0 diff --git a/python/src/lib.rs b/python/src/lib.rs index d927311bec..810c2dae92 100644 --- a/python/src/lib.rs +++ b/python/src/lib.rs @@ -28,6 +28,7 @@ use pyo3::prelude::*; use std::collections::HashMap; mod cluster; +mod query_planner; mod utils; pub(crate) struct TokioRuntime(tokio::runtime::Runtime); @@ -38,12 +39,24 @@ fn _internal_ballista(_py: Python, m: Bound<'_, PyModule>) -> PyResult<()> { m.add_class::()?; m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; + m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_function(wrap_pyfunction!(create_ballista_data_frame, m.clone())?)?; + m.add_function(wrap_pyfunction!( + query_planner::ballista_datafusion_config_defaults, + m.clone() + )?)?; + m.add_function(wrap_pyfunction!( + query_planner::with_ballista_query_planner, + m.clone() + )?)?; m.add_function(wrap_pyfunction!( crate::cluster::setup_test_cluster, m.clone() diff --git a/python/src/query_planner.rs b/python/src/query_planner.rs new file mode 100644 index 0000000000..0d10423cc0 --- /dev/null +++ b/python/src/query_planner.rs @@ -0,0 +1,512 @@ +// 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. + +use ballista_core::extension::SessionConfigExt; +use ballista_core::planner::BallistaQueryPlanner; +use ballista_core::serde::{ + BallistaLogicalExtensionCodec as NativeBallistaLogicalExtensionCodec, + BallistaPhysicalExtensionCodec as NativeBallistaPhysicalExtensionCodec, +}; +use datafusion::catalog::Session; +use datafusion::common::{DataFusionError, Result}; +use datafusion::execution::config::SessionConfig; +use datafusion::execution::context::QueryPlanner; +use datafusion::logical_expr::LogicalPlan; +use datafusion::physical_plan::ExecutionPlan; +use datafusion_ffi::execution::FFI_TaskContextProvider; +use datafusion_ffi::proto::logical_extension_codec::FFI_LogicalExtensionCodec; +use datafusion_ffi::proto::physical_extension_codec::FFI_PhysicalExtensionCodec; +use datafusion_ffi::query_planner::FFI_QueryPlanner; +use datafusion_proto::logical_plan::LogicalExtensionCodec; +use datafusion_proto::physical_plan::PhysicalExtensionCodec; +use datafusion_proto::protobuf::LogicalPlanNode; +use pyo3::exceptions::PyValueError; +use pyo3::prelude::*; +use pyo3::types::{PyCapsule, PyDict}; +use std::collections::HashMap; +use std::ptr::NonNull; +use std::sync::{Arc, OnceLock}; +use tokio::runtime::{Handle, Runtime}; +use url::Url; + +const DEFAULT_SCHEDULER_PORT: u16 = 50050; + +#[pyclass( + name = "BallistaExtension", + module = "ballista._internal_ballista", + skip_from_py_object +)] +pub(crate) struct PyBallistaExtension { + address: String, + config_overrides: Option>, +} + +#[pymethods] +impl PyBallistaExtension { + #[new] + #[pyo3(signature = (address, config_overrides=None))] + fn new(address: String, config_overrides: Option>) -> Self { + Self { + address, + config_overrides, + } + } + + fn __datafusion_session_extension__<'py>( + &self, + py: Python<'py>, + session_ctx: Bound<'py, PyAny>, + ) -> PyResult> { + ballista_extension_components( + py, + session_ctx, + self.address.clone(), + self.config_overrides.clone(), + ) + } +} + +#[pyclass( + name = "BallistaLogicalExtensionCodec", + module = "ballista._internal_ballista", + skip_from_py_object +)] +pub(crate) struct PyBallistaLogicalExtensionCodec { + logical_codec: Arc, + ffi_logical_codec: FFI_LogicalExtensionCodec, + // Retain the source context for the legacy low-level API. Atomic extension + // installation leaves this empty so the returned context owns the provider. + _session_ctx: Option>, +} + +#[pymethods] +impl PyBallistaLogicalExtensionCodec { + #[new] + fn new(session_ctx: Bound<'_, PyAny>) -> PyResult { + let user_logical_codec: Arc = + (&ffi_logical_codec_from_python(session_ctx.clone())?).into(); + let logical_codec: Arc = + Arc::new(NativeBallistaLogicalExtensionCodec::new(user_logical_codec)); + let task_ctx_provider = ffi_task_ctx_provider_from_python(session_ctx.clone())?; + let ffi_logical_codec = FFI_LogicalExtensionCodec::new( + Arc::clone(&logical_codec), + Some(tokio_runtime_handle()), + task_ctx_provider, + ); + + Ok(Self { + logical_codec, + ffi_logical_codec, + _session_ctx: Some(session_ctx.unbind()), + }) + } + + fn __datafusion_logical_extension_codec__<'py>( + &self, + py: Python<'py>, + ) -> PyResult> { + PyCapsule::new_with_value( + py, + self.ffi_logical_codec.clone(), + cr"datafusion_logical_extension_codec", + ) + } +} + +#[pyclass( + name = "BallistaPhysicalExtensionCodec", + module = "ballista._internal_ballista", + skip_from_py_object +)] +pub(crate) struct PyBallistaPhysicalExtensionCodec { + ffi_physical_codec: FFI_PhysicalExtensionCodec, + // Retain the source context for the legacy low-level API. Atomic extension + // installation leaves this empty so the returned context owns the provider. + _session_ctx: Option>, + // Retain the Python logical codec as well as its native Arc. + _logical_codec: Py, +} + +impl PyBallistaPhysicalExtensionCodec { + fn from_logical_codec( + session_ctx: Bound<'_, PyAny>, + logical_codec: Arc, + logical_codec_object: Py, + ) -> PyResult { + let ffi_physical_codec = + ballista_physical_ffi_codec(session_ctx.clone(), logical_codec)?; + + Ok(Self { + ffi_physical_codec, + _session_ctx: Some(session_ctx.unbind()), + _logical_codec: logical_codec_object, + }) + } +} + +#[pymethods] +impl PyBallistaPhysicalExtensionCodec { + #[new] + fn new( + session_ctx: Bound<'_, PyAny>, + logical_codec: Bound<'_, PyAny>, + ) -> PyResult { + let native_logical_codec = { + let logical_codec = + logical_codec.extract::>()?; + Arc::clone(&logical_codec.logical_codec) + }; + Self::from_logical_codec( + session_ctx, + native_logical_codec, + logical_codec.unbind(), + ) + } + + fn __datafusion_physical_extension_codec__<'py>( + &self, + py: Python<'py>, + ) -> PyResult> { + PyCapsule::new_with_value( + py, + self.ffi_physical_codec.clone(), + cr"datafusion_physical_extension_codec", + ) + } +} + +#[pyclass( + name = "BallistaQueryPlanner", + module = "ballista._internal_ballista", + skip_from_py_object +)] +pub(crate) struct PyBallistaQueryPlanner { + address: String, + config: ballista_core::config::BallistaConfig, + logical_codec: Arc, + fallback_logical_codec: FFI_LogicalExtensionCodec, + fallback_physical_codec: FFI_PhysicalExtensionCodec, + // Retain the source context for the legacy low-level API. Atomic extension + // installation leaves this empty so the returned context owns the provider. + _session_ctx: Option>, +} + +#[pymethods] +impl PyBallistaQueryPlanner { + #[new] + #[pyo3(signature = (address, session_ctx, config_overrides=None))] + fn new( + address: String, + session_ctx: Bound<'_, PyAny>, + config_overrides: Option>, + ) -> PyResult { + let logical_codec = PyBallistaLogicalExtensionCodec::new(session_ctx.clone())?; + let fallback_physical_codec = ballista_physical_ffi_codec( + session_ctx.clone(), + Arc::clone(&logical_codec.logical_codec), + )?; + Self::from_codecs( + address, + session_ctx, + config_overrides, + logical_codec.logical_codec, + logical_codec.ffi_logical_codec, + fallback_physical_codec, + ) + } + + fn __datafusion_query_planner__<'py>( + &self, + py: Python<'py>, + ) -> PyResult> { + let planner: Arc = + Arc::new(LazyBallistaQueryPlanner { + address: self.address.clone(), + config: self.config.clone(), + logical_codec: Arc::clone(&self.logical_codec), + _session_ctx: self + ._session_ctx + .as_ref() + .map(|session_ctx| session_ctx.clone_ref(py)), + }); + let ffi = FFI_QueryPlanner::new_with_ffi_codecs( + planner, + self.fallback_logical_codec.clone(), + self.fallback_physical_codec.clone(), + ); + + // This exact name is the ABI consumed by datafusion-python. + PyCapsule::new_with_value(py, ffi, cr"datafusion_query_planner") + } +} + +impl PyBallistaQueryPlanner { + fn from_codecs( + address: String, + session_ctx: Bound<'_, PyAny>, + config_overrides: Option>, + logical_codec: Arc, + fallback_logical_codec: FFI_LogicalExtensionCodec, + fallback_physical_codec: FFI_PhysicalExtensionCodec, + ) -> PyResult { + let mut session_config = SessionConfig::new_with_ballista(); + if let Some(overrides) = config_overrides { + for (key, value) in overrides { + if !key.starts_with("ballista.") { + return Err(PyValueError::new_err(format!( + "unsupported Ballista configuration key: {key}" + ))); + } + session_config + .options_mut() + .set(&key, &value) + .map_err(|error| PyValueError::new_err(error.to_string()))?; + } + } + + Ok(Self { + address, + config: session_config.ballista_config(), + logical_codec, + fallback_logical_codec, + fallback_physical_codec, + _session_ctx: Some(session_ctx.unbind()), + }) + } +} + +struct LazyBallistaQueryPlanner { + address: String, + config: ballista_core::config::BallistaConfig, + logical_codec: Arc, + _session_ctx: Option>, +} + +impl std::fmt::Debug for LazyBallistaQueryPlanner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("LazyBallistaQueryPlanner") + .field("address", &self.address) + .field("config", &self.config) + .finish_non_exhaustive() + } +} + +#[async_trait::async_trait] +impl QueryPlanner for LazyBallistaQueryPlanner { + async fn create_physical_plan( + &self, + logical_plan: &LogicalPlan, + session: &dyn Session, + ) -> Result> { + if matches!(logical_plan, LogicalPlan::Analyze(_)) { + return Err(DataFusionError::NotImplemented( + "EXPLAIN ANALYZE is not yet supported by the Ballista Python FFI planner" + .to_string(), + )); + } + + // Parse only when DataFusion asks for a physical plan so malformed + // addresses fail lazily, not during context construction. + let scheduler_url = parse_scheduler_url(&self.address)?; + let planner = BallistaQueryPlanner::::with_extension( + scheduler_url, + self.config.clone(), + Arc::clone(&self.logical_codec), + ); + planner.create_physical_plan(logical_plan, session).await + } +} + +#[pyfunction] +pub(crate) fn ballista_datafusion_config_defaults() -> HashMap { + let defaults = SessionConfig::new(); + let ballista = SessionConfig::new_with_ballista(); + let default_values = defaults + .options() + .entries() + .into_iter() + .map(|entry| (entry.key, entry.value)) + .collect::>(); + + ballista + .options() + .entries() + .into_iter() + .filter_map(|entry| { + if !entry.key.starts_with("datafusion.") { + return None; + } + let value = entry.value?; + (default_values.get(&entry.key) != Some(&Some(value.clone()))) + .then_some((entry.key, value)) + }) + .collect() +} + +fn ballista_extension_components<'py>( + py: Python<'py>, + session_ctx: Bound<'py, PyAny>, + address: String, + config_overrides: Option>, +) -> PyResult> { + let mut logical_codec = PyBallistaLogicalExtensionCodec::new(session_ctx.clone())?; + let logical_native = Arc::clone(&logical_codec.logical_codec); + let fallback_logical_codec = logical_codec.ffi_logical_codec.clone(); + logical_codec._session_ctx = None; + let logical_codec = Py::new(py, logical_codec)?; + + let mut physical_codec = PyBallistaPhysicalExtensionCodec::from_logical_codec( + session_ctx.clone(), + Arc::clone(&logical_native), + logical_codec.clone_ref(py).into_any(), + )?; + let fallback_physical_codec = physical_codec.ffi_physical_codec.clone(); + physical_codec._session_ctx = None; + let physical_codec = Py::new(py, physical_codec)?; + + let mut planner = PyBallistaQueryPlanner::from_codecs( + address, + session_ctx, + config_overrides, + logical_native, + fallback_logical_codec, + fallback_physical_codec, + )?; + planner._session_ctx = None; + let planner = Py::new(py, planner)?; + + let components = py + .import("datafusion")? + .getattr("SessionExtensionComponents")?; + let kwargs = PyDict::new(py); + kwargs.set_item("logical_extension_codecs", (logical_codec,))?; + kwargs.set_item("physical_extension_codecs", (physical_codec,))?; + kwargs.set_item("query_planner", planner)?; + components.call((), Some(&kwargs)) +} + +#[pyfunction] +#[pyo3(signature = (session_ctx, address, config_overrides=None))] +pub(crate) fn with_ballista_query_planner( + py: Python<'_>, + session_ctx: Bound<'_, PyAny>, + address: String, + config_overrides: Option>, +) -> PyResult> { + let mut ballista_overrides = HashMap::new(); + if let Some(overrides) = config_overrides { + for (key, value) in overrides { + if key.starts_with("datafusion.") { + apply_datafusion_override(&session_ctx, &key, &value)?; + } else if key.starts_with("ballista.") { + ballista_overrides.insert(key, value); + } else { + return Err(PyValueError::new_err(format!( + "configuration key must start with 'datafusion.' or 'ballista.': {key}" + ))); + } + } + } + + let extension = Py::new( + py, + PyBallistaExtension::new(address, Some(ballista_overrides)), + )?; + Ok(session_ctx + .call_method1("with_extensions", (extension.bind(py),))? + .unbind()) +} + +fn ballista_physical_ffi_codec( + session_ctx: Bound<'_, PyAny>, + logical_codec: Arc, +) -> PyResult { + let physical_codec: Arc = + Arc::new(NativeBallistaPhysicalExtensionCodec::new(logical_codec)); + let task_ctx_provider = ffi_task_ctx_provider_from_python(session_ctx)?; + Ok(FFI_PhysicalExtensionCodec::new( + physical_codec, + Some(tokio_runtime_handle()), + task_ctx_provider, + )) +} + +fn apply_datafusion_override( + session_ctx: &Bound<'_, PyAny>, + key: &str, + value: &str, +) -> PyResult<()> { + if !key + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'.' | b'_')) + { + return Err(PyValueError::new_err(format!( + "invalid DataFusion configuration key: {key}" + ))); + } + + // SET mutates the shared session state. The contexts derived below retain + // that state, including registered tables and functions. + let escaped_value = value.replace('\'', "''"); + let statement = format!("SET {key} = '{escaped_value}'"); + session_ctx.call_method1("sql", (statement,))?; + Ok(()) +} + +fn parse_scheduler_url(address: &str) -> Result { + let url = + Url::parse(address).map_err(|e| DataFusionError::Configuration(e.to_string()))?; + let host = url.host().ok_or_else(|| { + DataFusionError::Configuration("hostname should be provided".to_string()) + })?; + let port = url.port().unwrap_or(DEFAULT_SCHEDULER_PORT); + Ok(format!("http://{host}:{port}")) +} + +fn tokio_runtime_handle() -> Handle { + static RUNTIME: OnceLock = OnceLock::new(); + RUNTIME + .get_or_init(|| Runtime::new().expect("tokio runtime for Ballista Python FFI")) + .handle() + .clone() +} + +fn ffi_logical_codec_from_python( + obj: Bound<'_, PyAny>, +) -> PyResult { + let capsule = obj + .getattr("__datafusion_logical_extension_codec__")? + .call0()?; + let capsule = capsule.cast::()?; + let data: NonNull = capsule + .pointer_checked(Some(c"datafusion_logical_extension_codec"))? + .cast(); + Ok(unsafe { data.as_ref().clone() }) +} + +fn ffi_task_ctx_provider_from_python( + obj: Bound<'_, PyAny>, +) -> PyResult { + let capsule = obj + .getattr("__datafusion_task_context_provider__")? + .call0()?; + let capsule = capsule.cast::()?; + let data: NonNull = capsule + .pointer_checked(Some(c"datafusion_task_context_provider"))? + .cast(); + Ok(unsafe { data.as_ref().clone() }) +} diff --git a/python/uv.lock b/python/uv.lock index 81ee8f45bb..4966fc4bed 100644 --- a/python/uv.lock +++ b/python/uv.lock @@ -52,7 +52,7 @@ dev = [ [package.metadata] requires-dist = [ - { name = "datafusion", specifier = "==54" }, + { name = "datafusion", git = "https://github.com/apache/datafusion-python.git?rev=f1526210338d75ef105246e5c948e0e4a4a0f5ce" }, { name = "ipython", marker = "extra == 'jupyter'", specifier = ">=8.0.0" }, { name = "pyarrow", specifier = ">=23.0.1" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, @@ -328,25 +328,12 @@ wheels = [ [[package]] name = "datafusion" version = "54.0.0" -source = { registry = "https://pypi.org/simple" } +source = { git = "https://github.com/apache/datafusion-python.git?rev=f1526210338d75ef105246e5c948e0e4a4a0f5ce#f1526210338d75ef105246e5c948e0e4a4a0f5ce" } dependencies = [ { name = "cloudpickle" }, { name = "pyarrow" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/90/886f7e9cf827f07ebd60bd293e54e0a028a50dd49bbaef0ee42aae1981ea/datafusion-54.0.0.tar.gz", hash = "sha256:cfe7e8dfc026efc05824f49b53ad6a72caf5c2d6820759b6212a09e245a427ed", size = 276448, upload-time = "2026-06-29T11:19:34.816Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/58/4c5b981e3d9ade32a906c15a4941eef50c9b862781cdc14bf4dff48d026a/datafusion-54.0.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:946f55e48b8d523d7b4ac106bdf588b4493c2c66f81877d6952aafeaf7c3ec73", size = 39810553, upload-time = "2026-06-29T11:19:02.1Z" }, - { url = "https://files.pythonhosted.org/packages/66/e5/5e4dbd42ce9a2affb3be90d9ab17cebde1a6f28b0d9fb4b83d612d5c8e42/datafusion-54.0.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:2a3bf43185c7e43e25242e5fb17b6a11b86bf976434c0bc493fdedbd9a080969", size = 37145255, upload-time = "2026-06-29T11:19:05.491Z" }, - { url = "https://files.pythonhosted.org/packages/c6/5e/dbb9e6e3e5006d34f295d7ac73f1302c8f2df140666402a06e6c55028edb/datafusion-54.0.0-cp310-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9432bf162381e9282cbc74915b8b773895de18be836f7e3f6d0de4d981f24630", size = 38853856, upload-time = "2026-06-29T11:19:08.732Z" }, - { url = "https://files.pythonhosted.org/packages/a8/81/e69008e3479f4d0134875bc4ae39503bedcd55ca2597e71392c963c651b4/datafusion-54.0.0-cp310-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3bcd4d213fa74710e75e6e182cc468c2bdbc5ffc74a08c8155d414fbbfa1b3f6", size = 41050149, upload-time = "2026-06-29T11:19:12.108Z" }, - { url = "https://files.pythonhosted.org/packages/61/d4/8ba6e3fe3291c9ccc94b5ca3ec3c1fbcbfbe5ece5ffb965e4550844e2c56/datafusion-54.0.0-cp310-abi3-win_amd64.whl", hash = "sha256:b934e097e1bdca7d5768a81ac1bc4a1812cb459269f8b1a5d892a5d930f18376", size = 43444869, upload-time = "2026-06-29T11:19:15.963Z" }, - { url = "https://files.pythonhosted.org/packages/9d/41/5608323226f21a0fa180823c531dbc0ed270e9b694f299b7647505cb6a06/datafusion-54.0.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:c4e79048da82ad89b768bd0be7df39254cd2a0afe2b719d1f129e8a7229af683", size = 39796248, upload-time = "2026-06-29T11:19:19.208Z" }, - { url = "https://files.pythonhosted.org/packages/18/81/392ee323104ab14ca689384723b69e137064a828233c165574f97a74c0e9/datafusion-54.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fe57038003b18e28b90752c1e32b44af74ec4f552a1904aee725e1129a00c447", size = 37153577, upload-time = "2026-06-29T11:19:22.397Z" }, - { url = "https://files.pythonhosted.org/packages/40/c4/ebd5ef5349ecbea7f5f9da76c213581c13e7bbe1b5735c9925b279eeb4eb/datafusion-54.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:574f642832a106456cfc4f32aa82484c504fc32f4be2b510202bcb579de8e6d1", size = 38849839, upload-time = "2026-06-29T11:19:25.783Z" }, - { url = "https://files.pythonhosted.org/packages/5a/b9/2383d30d317bb913cab97dbf2e6e1d5f37f594860d5c5bc176e025cf7d4a/datafusion-54.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:796fd5683927443c5bc61999d00b9007ef9b5ce107725ea8d241df718860985d", size = 41074623, upload-time = "2026-06-29T11:19:29.119Z" }, - { url = "https://files.pythonhosted.org/packages/35/5c/553fd1107dede0a56727fda7216a7198d41394f2d19697f4fb104cc695ea/datafusion-54.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:64973c63874ec31670dd97b32b18af7b07fad679cb20d58ed154038e3a5c204e", size = 43438801, upload-time = "2026-06-29T11:19:32.799Z" }, -] [[package]] name = "decorator"