diff --git a/Cargo.lock b/Cargo.lock index 71da4efe..47553a76 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -223,7 +223,7 @@ dependencies = [ "chrono", "chrono-tz 0.10.3", "half", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "num", ] @@ -602,9 +602,9 @@ dependencies = [ [[package]] name = "aws-sdk-bedrockruntime" -version = "1.85.0" +version = "1.86.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f6c003cd82739447a18d7616468b047341c125efff11fdafc77a5e777a861c9" +checksum = "db14a0566037a6c686ef075c406dec4b067537af3d76950522e9e89848ce7a5a" dependencies = [ "aws-credential-types", "aws-runtime", @@ -628,9 +628,9 @@ dependencies = [ [[package]] name = "aws-sdk-dynamodb" -version = "1.72.1" +version = "1.73.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b14d5b5d6849d1caa7b404ea57cbe25ed8ba25c3c7d47f45bcbd5b51e098ceac" +checksum = "8d954f3581bd7254f42bbaa3a21dfd99d40a14d82a324d2012b8f3ea0d15f12b" dependencies = [ "aws-credential-types", "aws-runtime", @@ -651,9 +651,9 @@ dependencies = [ [[package]] name = "aws-sdk-kms" -version = "1.66.0" +version = "1.67.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655097cd83ab1f15575890943135192560f77097413c6dd1733fdbdc453e81ac" +checksum = "2b650cf9e1e153ab13acd3aa1f73b271dac14e019353ec0b0c176f24a21bad03" dependencies = [ "aws-credential-types", "aws-runtime", @@ -674,9 +674,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.83.0" +version = "1.84.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51384750334005f40e1a334b0d54eca822a77eacdcf3c50fdf38f583c5eee7a2" +checksum = "2111975ef21dc06542918479df0df861b273eb8d99e6bb987da469b546dce32c" dependencies = [ "aws-credential-types", "aws-runtime", @@ -709,9 +709,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.65.0" +version = "1.66.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8efec445fb78df585327094fcef4cad895b154b58711e504db7a93c41aa27151" +checksum = "858007b14d0f1ade2e0124473c2126b24d334dc9486ad12eb7c0ed14757be464" dependencies = [ "aws-credential-types", "aws-runtime", @@ -732,9 +732,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.66.0" +version = "1.67.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e49cca619c10e7b002dc8e66928ceed66ab7f56c1a3be86c5437bf2d8d89bba" +checksum = "b83abf3ae8bd10a014933cc2383964a12ca5a3ebbe1948ad26b1b808e7d0d1f2" dependencies = [ "aws-credential-types", "aws-runtime", @@ -755,9 +755,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.66.0" +version = "1.67.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7420479eac0a53f776cc8f0d493841ffe58ad9d9783f3947be7265784471b47a" +checksum = "74e8e9ac4a837859c8f1d747054172e1e55933f02ed34728b0b34dea0591ec84" dependencies = [ "aws-credential-types", "aws-runtime", @@ -879,7 +879,7 @@ dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", - "h2 0.4.9", + "h2 0.4.10", "http 0.2.12", "http 1.3.1", "http-body 0.4.6", @@ -890,7 +890,7 @@ dependencies = [ "hyper-util", "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.26", + "rustls 0.23.27", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", @@ -1326,9 +1326,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.20" +version = "1.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a" +checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0" dependencies = [ "jobserver", "libc", @@ -3065,9 +3065,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" +checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" dependencies = [ "atomic-waker", "bytes", @@ -3115,9 +3115,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ "allocator-api2", "equivalent", @@ -3302,7 +3302,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.9", + "h2 0.4.10", "http 1.3.1", "http-body 1.0.1", "httparse", @@ -3339,7 +3339,7 @@ dependencies = [ "http 1.3.1", "hyper 1.6.0", "hyper-util", - "rustls 0.23.26", + "rustls 0.23.27", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", @@ -3564,7 +3564,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "serde", ] @@ -3661,9 +3661,9 @@ checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8" [[package]] name = "jiff" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a064218214dc6a10fbae5ec5fa888d80c45d611aba169222fc272072bf7aef6" +checksum = "d07d8d955d798e7a4d6f9c58cd1f1916e790b42b092758a9ef6e16fef9f1b3fd" dependencies = [ "jiff-static", "log", @@ -3674,9 +3674,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "199b7932d97e325aff3a7030e141eafe7f2c6268e1d1b24859b753a627f45254" +checksum = "f244cfe006d98d26f859c7abd1318d85327e1882dc9cef80f62daeeb0adcf300" dependencies = [ "proc-macro2", "quote", @@ -4135,7 +4135,7 @@ dependencies = [ [[package]] name = "lancedb" -version = "0.19.1-beta.1" +version = "0.19.1-beta.2" dependencies = [ "arrow", "arrow-array", @@ -4222,7 +4222,7 @@ dependencies = [ [[package]] name = "lancedb-node" -version = "0.19.1-beta.1" +version = "0.19.1-beta.2" dependencies = [ "arrow-array", "arrow-ipc", @@ -4247,7 +4247,7 @@ dependencies = [ [[package]] name = "lancedb-nodejs" -version = "0.19.1-beta.1" +version = "0.19.1-beta.2" dependencies = [ "arrow-array", "arrow-ipc", @@ -4266,7 +4266,7 @@ dependencies = [ [[package]] name = "lancedb-python" -version = "0.22.1-beta.1" +version = "0.22.1-beta.2" dependencies = [ "arrow", "env_logger", @@ -4389,9 +4389,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9627da5196e5d8ed0b0495e61e518847578da83483c37288316d9b2e03a7f72" +checksum = "a25169bd5913a4b437588a7e3d127cd6e90127b60e0ffbd834a38f1599e016b8" [[package]] name = "libredox" @@ -4456,7 +4456,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -5848,7 +5848,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls 0.23.26", + "rustls 0.23.27", "socket2", "thiserror 2.0.12", "tokio", @@ -5867,7 +5867,7 @@ dependencies = [ "rand 0.9.1", "ring", "rustc-hash 2.1.1", - "rustls 0.23.26", + "rustls 0.23.27", "rustls-pki-types", "slab", "thiserror 2.0.12", @@ -5878,9 +5878,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "541d0f57c6ec747a90738a52741d3221f7960e8ac2f0ff4b1a63680e033b4ab5" +checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842" dependencies = [ "cfg_aliases", "libc", @@ -6086,9 +6086,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ "bitflags 2.9.0", ] @@ -6183,7 +6183,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.4.9", + "h2 0.4.10", "http 1.3.1", "http-body 1.0.1", "http-body-util", @@ -6199,7 +6199,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.26", + "rustls 0.23.27", "rustls-native-certs 0.8.1", "rustls-pemfile 2.2.0", "rustls-pki-types", @@ -6355,9 +6355,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.5" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ "bitflags 2.9.0", "errno", @@ -6380,16 +6380,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.26" +version = "0.23.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.1", + "rustls-webpki 0.103.2", "subtle", "zeroize", ] @@ -6457,9 +6457,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.1" +version = "0.103.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" +checksum = "7149975849f1abb3832b246010ef62ccc80d3a76169517ada7188252b9cfb437" dependencies = [ "aws-lc-rs", "ring", @@ -6712,9 +6712,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -7033,9 +7033,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", @@ -7265,7 +7265,7 @@ dependencies = [ "fastrand", "getrandom 0.3.2", "once_cell", - "rustix 1.0.5", + "rustix 1.0.7", "windows-sys 0.59.0", ] @@ -7460,7 +7460,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.26", + "rustls 0.23.27", "tokio", ] @@ -7685,7 +7685,7 @@ dependencies = [ "flate2", "log", "once_cell", - "rustls 0.23.26", + "rustls 0.23.27", "rustls-pki-types", "serde", "serde_json", @@ -7905,9 +7905,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.9" +version = "0.26.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29aad86cec885cafd03e8305fd727c418e970a521322c91688414d5b8efba16b" +checksum = "37493cadf42a2a939ed404698ded7fb378bf301b5011f973361779a3a74f8c93" dependencies = [ "rustls-pki-types", ] @@ -8397,9 +8397,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.7" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb8234a863ea0e8cd7284fcdd4f145233eb00fee02bbdd9861aec44e6477bc5" +checksum = "d9fb597c990f03753e08d3c29efbfcf2019a003b4bf4ba19225c158e1549f0f3" dependencies = [ "memchr", ] diff --git a/rust/lancedb/src/remote/table.rs b/rust/lancedb/src/remote/table.rs index 81061fb4..b3c5c54d 100644 --- a/rust/lancedb/src/remote/table.rs +++ b/rust/lancedb/src/remote/table.rs @@ -758,8 +758,7 @@ impl BaseTable for RemoteTable { let (request_id, response) = self.send_streaming(request, data, true).await?; let response = self.check_table_response(&request_id, response).await?; let body = response.text().await.err_to_http(request_id.clone())?; - - if body.trim().is_empty() || body == "{}" { + if body.trim().is_empty() { // Backward compatible with old servers return Ok(AddResult { version: 0 }); } @@ -922,7 +921,7 @@ impl BaseTable for RemoteTable { let response = self.check_table_response(&request_id, response).await?; let body = response.text().await.err_to_http(request_id.clone())?; - if body.trim().is_empty() || body == "{}" { + if body.trim().is_empty() { // Backward compatible with old servers return Ok(UpdateResult { rows_updated: 0, @@ -950,12 +949,10 @@ impl BaseTable for RemoteTable { let (request_id, response) = self.send(request, true).await?; let response = self.check_table_response(&request_id, response).await?; let body = response.text().await.err_to_http(request_id.clone())?; - - if body == "{}" { + if body.trim().is_empty() { // Backward compatible with old servers return Ok(DeleteResult { version: 0 }); } - let delete_response: DeleteResult = serde_json::from_str(&body).map_err(|e| Error::Http { source: format!("Failed to parse delete response: {}", e).into(), @@ -1083,7 +1080,7 @@ impl BaseTable for RemoteTable { let response = self.check_table_response(&request_id, response).await?; let body = response.text().await.err_to_http(request_id.clone())?; - if body.trim().is_empty() || body == "{}" { + if body.trim().is_empty() { // Backward compatible with old servers return Ok(MergeResult { version: 0, @@ -1145,7 +1142,7 @@ impl BaseTable for RemoteTable { let response = self.check_table_response(&request_id, response).await?; let body = response.text().await.err_to_http(request_id.clone())?; - if body.trim().is_empty() || body == "{}" { + if body.trim().is_empty() { // Backward compatible with old servers return Ok(AddColumnsResult { version: 0 }); } @@ -1198,7 +1195,7 @@ impl BaseTable for RemoteTable { let response = self.check_table_response(&request_id, response).await?; let body = response.text().await.err_to_http(request_id.clone())?; - if body.trim().is_empty() || body == "{}" { + if body.trim().is_empty() { // Backward compatible with old servers return Ok(AlterColumnsResult { version: 0 }); } @@ -1223,7 +1220,7 @@ impl BaseTable for RemoteTable { let response = self.check_table_response(&request_id, response).await?; let body = response.text().await.err_to_http(request_id.clone())?; - if body.trim().is_empty() || body == "{}" { + if body.trim().is_empty() { // Backward compatible with old servers return Ok(DropColumnsResult { version: 0 }); } @@ -1603,16 +1600,21 @@ mod tests { } #[rstest] - #[case(true)] - #[case(false)] + #[case("", 0)] + #[case("{}", 0)] + #[case(r#"{"request_id": "test-request-id"}"#, 0)] + #[case(r#"{"version": 43}"#, 43)] #[tokio::test] - async fn test_add_append(#[case] old_server: bool) { + async fn test_add_append(#[case] response_body: &str, #[case] expected_version: u64) { let data = RecordBatch::try_new( Arc::new(Schema::new(vec![Field::new("a", DataType::Int32, false)])), vec![Arc::new(Int32Array::from(vec![1, 2, 3]))], ) .unwrap(); + // Clone response_body to give it 'static lifetime for the closure + let response_body = response_body.to_string(); + let (sender, receiver) = std::sync::mpsc::channel(); let table = Table::new_with_handler("my_table", move |mut request| { if request.url().path() == "/v1/table/my_table/insert/" { @@ -1622,36 +1624,29 @@ mod tests { .query_pairs() .filter(|(k, _)| k == "mode") .all(|(_, v)| v == "append")); - assert_eq!( request.headers().get("Content-Type").unwrap(), ARROW_STREAM_CONTENT_TYPE ); - let mut body_out = reqwest::Body::from(Vec::new()); std::mem::swap(request.body_mut().as_mut().unwrap(), &mut body_out); sender.send(body_out).unwrap(); - - if old_server { - http::Response::builder().status(200).body("").unwrap() - } else { - http::Response::builder() - .status(200) - .body(r#"{"version": 43}"#) - .unwrap() - } + http::Response::builder() + .status(200) + .body(response_body.clone()) + .unwrap() } else { panic!("Unexpected request path: {}", request.url().path()); } }); - let result = table .add(RecordBatchIterator::new([Ok(data.clone())], data.schema())) .execute() .await .unwrap(); - assert_eq!(result.version, if old_server { 0 } else { 43 }); + // Check version matches expected value + assert_eq!(result.version, expected_version); let body = receiver.recv().unwrap(); let body = collect_body(body).await; diff --git a/rust/lancedb/src/table.rs b/rust/lancedb/src/table.rs index 2ce192c0..febe6762 100644 --- a/rust/lancedb/src/table.rs +++ b/rust/lancedb/src/table.rs @@ -425,10 +425,12 @@ pub trait Tags: Send + Sync { #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct UpdateResult { + #[serde(default)] pub rows_updated: u64, // The commit version associated with the operation. // A version of `0` indicates compatibility with legacy servers that do not return /// a commit version. + #[serde(default)] pub version: u64, } @@ -437,6 +439,7 @@ pub struct AddResult { // The commit version associated with the operation. // A version of `0` indicates compatibility with legacy servers that do not return /// a commit version. + #[serde(default)] pub version: u64, } @@ -445,6 +448,7 @@ pub struct DeleteResult { // The commit version associated with the operation. // A version of `0` indicates compatibility with legacy servers that do not return /// a commit version. + #[serde(default)] pub version: u64, } @@ -453,14 +457,18 @@ pub struct MergeResult { // The commit version associated with the operation. // A version of `0` indicates compatibility with legacy servers that do not return /// a commit version. + #[serde(default)] pub version: u64, /// Number of inserted rows (for user statistics) + #[serde(default)] pub num_inserted_rows: u64, /// Number of updated rows (for user statistics) + #[serde(default)] pub num_updated_rows: u64, /// Number of deleted rows (for user statistics) /// Note: This is different from internal references to 'deleted_rows', since we technically "delete" updated rows during processing. /// However those rows are not shared with the user. + #[serde(default)] pub num_deleted_rows: u64, } @@ -469,6 +477,7 @@ pub struct AddColumnsResult { // The commit version associated with the operation. // A version of `0` indicates compatibility with legacy servers that do not return /// a commit version. + #[serde(default)] pub version: u64, } @@ -477,6 +486,7 @@ pub struct AlterColumnsResult { // The commit version associated with the operation. // A version of `0` indicates compatibility with legacy servers that do not return /// a commit version. + #[serde(default)] pub version: u64, } @@ -485,6 +495,7 @@ pub struct DropColumnsResult { // The commit version associated with the operation. // A version of `0` indicates compatibility with legacy servers that do not return /// a commit version. + #[serde(default)] pub version: u64, }