From b5ac095716052f39f29160c74f3b9a8121dadbfc Mon Sep 17 00:00:00 2001 From: Jussi Saurio Date: Sun, 25 May 2025 19:34:51 +0300 Subject: [PATCH] Fix off-by-one error in max_frame after WAL load --- bindings/rust/src/lib.rs | 30 ++++++++++++++++++++++++++++++ core/storage/sqlite3_ondisk.rs | 4 +++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/bindings/rust/src/lib.rs b/bindings/rust/src/lib.rs index 30816e376..ccd5dae35 100644 --- a/bindings/rust/src/lib.rs +++ b/bindings/rust/src/lib.rs @@ -485,4 +485,34 @@ mod tests { Ok(()) } + + #[tokio::test] + async fn test_database_persistence_write_one_frame_many_times() -> Result<()> { + let temp_file = NamedTempFile::new().unwrap(); + let db_path = temp_file.path().to_str().unwrap(); + + for i in 0..100 { + { + let db = Builder::new_local(db_path).build().await?; + let conn = db.connect()?; + + conn.execute("CREATE TABLE IF NOT EXISTS test_persistence (id INTEGER PRIMARY KEY, name TEXT NOT NULL);", ()).await?; + conn.execute("INSERT INTO test_persistence (name) VALUES ('Alice');", ()) + .await?; + } + { + let db = Builder::new_local(db_path).build().await?; + let conn = db.connect()?; + + let mut rows_iter = conn + .query("SELECT count(*) FROM test_persistence;", ()) + .await?; + let rows = rows_iter.next().await?.unwrap(); + assert_eq!(rows.get_value(0)?, Value::Integer(i as i64 + 1)); + assert!(rows_iter.next().await?.is_none()); + } + } + + Ok(()) + } } diff --git a/core/storage/sqlite3_ondisk.rs b/core/storage/sqlite3_ondisk.rs index 0a8acc2d1..348465db7 100644 --- a/core/storage/sqlite3_ondisk.rs +++ b/core/storage/sqlite3_ondisk.rs @@ -1512,7 +1512,9 @@ pub fn read_entire_wal_dumb(file: &Arc) -> Result