diff --git a/core/lib.rs b/core/lib.rs index 0addaffc5..20691c455 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -63,7 +63,7 @@ pub use storage::wal::CheckpointStatus; pub use storage::wal::Wal; pub static DATABASE_VERSION: OnceLock = OnceLock::new(); -#[derive(Clone)] +#[derive(Clone, PartialEq, Eq)] enum TransactionState { Write, Read, diff --git a/core/storage/pager.rs b/core/storage/pager.rs index 559e872ae..611998a8d 100644 --- a/core/storage/pager.rs +++ b/core/storage/pager.rs @@ -215,6 +215,11 @@ impl Pager { Ok(CheckpointStatus::Done) } + pub fn end_read_tx(&self) -> Result<()> { + self.wal.borrow().end_read_tx()?; + Ok(()) + } + /// Reads a page from the database. pub fn read_page(&self, page_idx: usize) -> Result { trace!("read_page(page_idx = {})", page_idx); diff --git a/core/vdbe/mod.rs b/core/vdbe/mod.rs index 16156347a..8b6747dc5 100644 --- a/core/vdbe/mod.rs +++ b/core/vdbe/mod.rs @@ -1012,6 +1012,15 @@ impl Program { } } log::trace!("Halt auto_commit {}", self.auto_commit); + let connection = self + .connection + .upgrade() + .expect("only weak ref to connection?"); + let current_state = connection.transaction_state.borrow().clone(); + if current_state == TransactionState::Read { + pager.end_read_tx()?; + return Ok(StepResult::Done); + } return if self.auto_commit { match pager.end_tx() { Ok(crate::storage::wal::CheckpointStatus::IO) => Ok(StepResult::IO),