diff --git a/core/lib.rs b/core/lib.rs index e3ea5fe12..bcc4f8a92 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -42,6 +42,7 @@ mod numeric; #[global_allocator] static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; +use crate::storage::header_accessor::HeaderRef; use crate::translate::optimizer::optimize_plan; use crate::translate::pragma::TURSO_CDC_DEFAULT_TABLE_NAME; #[cfg(all(feature = "fs", feature = "conn_raw_api"))] @@ -310,7 +311,10 @@ impl Database { let pager = conn.pager.borrow().clone(); db.with_schema_mut(|schema| { - schema.schema_version = header_accessor::get_schema_cookie(&conn.pager.borrow())?; + let header_ref = pager.io.block(|| HeaderRef::from_pager(&pager))?; + let header = header_ref.borrow(); + let header_schema_cookie = header.schema_cookie.get(); + schema.schema_version = header_schema_cookie; let result = schema .make_from_btree(None, pager.clone(), &syms) .or_else(|e| { @@ -1702,8 +1706,9 @@ impl Statement { let mut res = self .program .step(&mut self.state, self.mv_store.clone(), self.pager.clone()); - for _ in 0..MAX_SCHEMA_RETRY { + for i in 0..MAX_SCHEMA_RETRY { // Only reprepare if we still need to update schema + dbg!(i); if !matches!(res, Err(LimboError::SchemaUpdated)) { break; } @@ -1717,12 +1722,13 @@ impl Statement { } fn reprepare(&mut self) -> Result<()> { + let conn = self.program.connection.clone(); + *conn.schema.borrow_mut() = conn._db.clone_schema()?; self.program = { let mut parser = Parser::new(self.program.sql.as_bytes()); let cmd = parser.next()?; let cmd = cmd.expect("Same SQL string should be able to be parsed"); - let conn = self.program.connection.clone(); let syms = conn.syms.borrow(); match cmd { diff --git a/core/translate/attach.rs b/core/translate/attach.rs index 5079c5e51..ceec97f5f 100644 --- a/core/translate/attach.rs +++ b/core/translate/attach.rs @@ -113,7 +113,6 @@ pub fn translate_attach( }, }); - program.epilogue(super::emitter::TransactionMode::None); Ok(program) } @@ -178,6 +177,5 @@ pub fn translate_detach( }, }); - program.epilogue(super::emitter::TransactionMode::None); Ok(program) } diff --git a/core/vdbe/execute.rs b/core/vdbe/execute.rs index 8b4d9d029..a96b5c5b2 100644 --- a/core/vdbe/execute.rs +++ b/core/vdbe/execute.rs @@ -4,6 +4,7 @@ use crate::numeric::{NullableInteger, Numeric}; use crate::schema::Table; use crate::storage::btree::{integrity_check, IntegrityCheckError, IntegrityCheckState}; use crate::storage::database::DatabaseFile; +use crate::storage::header_accessor::HeaderRef; use crate::storage::page_cache::DumbLruPageCache; use crate::storage::pager::{AtomicDbState, CreateBTreeFlags, DbState}; use crate::storage::sqlite3_ondisk::read_varint; @@ -2008,7 +2009,9 @@ pub fn op_transaction( if state.mv_tx_id.is_none() { // We allocate the first page lazily in the first transaction. return_if_io!(pager.maybe_allocate_page1()); - let header_schema_cookie = header_accessor::get_schema_cookie(pager)?; + let header_ref = pager.io.block(|| HeaderRef::from_pager(&pager))?; + let header = header_ref.borrow(); + let header_schema_cookie = header.schema_cookie.get(); if header_schema_cookie != *schema_cookie { return Err(LimboError::SchemaUpdated); } @@ -2084,8 +2087,9 @@ pub fn op_transaction( // Can only read header if page 1 has been allocated already // begin_write_tx and begin_read_tx guarantee that happens - let header_schema_cookie = header_accessor::get_schema_cookie(pager)?; - tracing::info!(header_schema_cookie, schema_cookie); + let header_ref = pager.io.block(|| HeaderRef::from_pager(&pager))?; + let header = header_ref.borrow(); + let header_schema_cookie = header.schema_cookie.get(); if header_schema_cookie != *schema_cookie { return Err(LimboError::SchemaUpdated); }