From b145ef50cc78d9d280f4de9884a4eef2e0a0ada2 Mon Sep 17 00:00:00 2001 From: neil Date: Wed, 16 Sep 2026 10:12:11 +0800 Subject: [PATCH] fix(sync): apply write checkpoint after draining crud --- powersync/src/db/internal.rs | 2 +- powersync/tests/crud_test.rs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/powersync/src/db/internal.rs b/powersync/src/db/internal.rs index 9d688c5..6edd23f 100644 --- a/powersync/src/db/internal.rs +++ b/powersync/src/db/internal.rs @@ -112,7 +112,7 @@ impl InnerPowerSyncState { if let Some(write_checkpoint) = write_checkpoint { // If there are no remaining crud items we can set the target op to the checkpoint. let stmt = writer.inner.prepare("SELECT 1 FROM ps_crud LIMIT 1")?; - if let ResultCode::OK = stmt.step()? { + if let ResultCode::DONE = stmt.step()? { target_op = write_checkpoint; } } diff --git a/powersync/tests/crud_test.rs b/powersync/tests/crud_test.rs index 523d380..a6a4c5c 100644 --- a/powersync/tests/crud_test.rs +++ b/powersync/tests/crud_test.rs @@ -222,6 +222,36 @@ fn insert() { }); } +#[test] +fn applies_checkpoint_after_draining_crud_queue() { + future::block_on(async move { + let test = DatabaseTest::new(); + let db = test.in_memory_database(); + + execute( + &db, + "INSERT INTO users (id, name) VALUES (?, ?)", + params!["test", "name"], + ) + .await; + + let transaction = db.next_crud_transaction().await.unwrap().unwrap(); + transaction.complete_with_checkpoint(42).await.unwrap(); + + let mut reader = db.reader().await.unwrap(); + let reader = reader.transaction().unwrap(); + let checkpoint: i64 = reader + .query_one( + "SELECT powersync_control('target_checkpoint_request_id', NULL)", + params![], + |row| row.get(0), + ) + .unwrap(); + + assert_eq!(checkpoint, 42); + }); +} + #[test] fn crud_transactions() { async fn create_transaction(db: &PowerSyncDatabase, amount: usize) {