This is an automated email from the ASF dual-hosted git repository.

erickguan pushed a commit to branch fix-sqlite-stat
in repository https://gitbox.apache.org/repos/asf/opendal.git

commit 6ddb38ba57f06a6badf9170e469ef8310ba93922
Author: Erick Guan <[email protected]>
AuthorDate: Sat Jul 4 17:18:01 2026 +0800

    Fix sqlite stat getting the entire object
---
 core/services/sqlite/src/backend.rs | 37 +++++++++++++++++++++++++++++++++----
 1 file changed, 33 insertions(+), 4 deletions(-)

diff --git a/core/services/sqlite/src/backend.rs 
b/core/services/sqlite/src/backend.rs
index 63feabbac..94449034a 100644
--- a/core/services/sqlite/src/backend.rs
+++ b/core/services/sqlite/src/backend.rs
@@ -228,10 +228,10 @@ impl Service for SqliteBackend {
         if p == build_abs_path(&self.root, "") {
             Ok(RpStat::new(Metadata::new(EntryMode::DIR)))
         } else {
-            let bs = self.core.get(&p).await?;
-            match bs {
-                Some(bs) => Ok(RpStat::new(
-                    
Metadata::new(EntryMode::from_path(&p)).with_content_length(bs.len() as u64),
+            let length = self.core.get_length(&p).await?;
+            match length {
+                Some(length) => Ok(RpStat::new(
+                    
Metadata::new(EntryMode::from_path(&p)).with_content_length(length as u64),
                 )),
                 None => {
                     // Check if this might be a directory by looking for keys 
with this prefix
@@ -437,4 +437,33 @@ mod test {
 
         assert_eq!(buffer.to_vec(), b"world");
     }
+
+    #[tokio::test]
+    async fn test_sqlite_stat_uses_value_length() {
+        let core = SqliteCore {
+            pool: build_client().await,
+            config: Default::default(),
+            table: "test".to_string(),
+            key_field: "key".to_string(),
+            value_field: "value".to_string(),
+        };
+        let pool = core.get_client().await.unwrap();
+        sqlx::query("CREATE TABLE test (key TEXT PRIMARY KEY, value BLOB)")
+            .execute(pool)
+            .await
+            .unwrap();
+
+        let accessor = SqliteBackend::new(core);
+        let ctx = OperationContext::new();
+        let mut writer = accessor.write(&ctx, "hello", 
OpWrite::default()).unwrap();
+        writer.write(Buffer::from("hello world")).await.unwrap();
+        writer.close().await.unwrap();
+
+        let rp = accessor
+            .stat(&ctx, "hello", OpStat::default())
+            .await
+            .unwrap();
+
+        assert_eq!(rp.into_metadata().content_length(), 11);
+    }
 }

Reply via email to