From bf69b86e94062d2746ac76cb4305f3cd28e05686 Mon Sep 17 00:00:00 2001 From: meteorgan Date: Fri, 11 Jul 2025 17:12:10 +0800 Subject: [PATCH] fix: not all pragma need transaction --- core/storage/header_accessor.rs | 1 + core/translate/pragma.rs | 45 ++++++++++++++++++--------------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/core/storage/header_accessor.rs b/core/storage/header_accessor.rs index 682a0ce61..766a122b0 100644 --- a/core/storage/header_accessor.rs +++ b/core/storage/header_accessor.rs @@ -203,6 +203,7 @@ pub fn get_page_size(pager: &Pager) -> Result { Ok(size as u32) } +#[allow(dead_code)] pub fn set_page_size(pager: &Pager, value: u32) -> Result<()> { let page_size = if value == MAX_PAGE_SIZE { 1 diff --git a/core/translate/pragma.rs b/core/translate/pragma.rs index 815ed0f04..0680f53dc 100644 --- a/core/translate/pragma.rs +++ b/core/translate/pragma.rs @@ -22,6 +22,7 @@ use strum::IntoEnumIterator; use super::integrity_check::translate_integrity_check; use crate::storage::header_accessor; use crate::storage::pager::Pager; +use crate::translate::emitter::TransactionMode; fn list_pragmas(program: &mut ProgramBuilder) { for x in PragmaName::iter() { @@ -47,7 +48,6 @@ pub fn translate_pragma( approx_num_labels: 0, }; program.extend(&opts); - let mut write = false; if name.name.0.eq_ignore_ascii_case("pragma_list") { list_pragmas(&mut program); @@ -59,22 +59,16 @@ pub fn translate_pragma( Err(_) => bail_parse_error!("Not a valid pragma name"), }; - let mut program = match body { + let (mut program, mode) = match body { None => query_pragma(pragma, schema, None, pager, connection, program)?, Some(ast::PragmaBody::Equals(value) | ast::PragmaBody::Call(value)) => match pragma { PragmaName::TableInfo => { query_pragma(pragma, schema, Some(value), pager, connection, program)? } - _ => { - write = true; - update_pragma(pragma, schema, value, pager, connection, program)? - } + _ => update_pragma(pragma, schema, value, pager, connection, program)?, }, }; - program.epilogue(match write { - false => super::emitter::TransactionMode::Read, - true => super::emitter::TransactionMode::Write, - }); + program.epilogue(mode); Ok(program) } @@ -86,7 +80,7 @@ fn update_pragma( pager: Rc, connection: Arc, mut program: ProgramBuilder, -) -> crate::Result { +) -> crate::Result<(ProgramBuilder, TransactionMode)> { match pragma { PragmaName::CacheSize => { let cache_size = match parse_signed_number(&value)? { @@ -95,7 +89,7 @@ fn update_pragma( _ => bail_parse_error!("Invalid value for cache size pragma"), }; update_cache_size(cache_size, pager, connection)?; - Ok(program) + Ok((program, TransactionMode::None)) } PragmaName::JournalMode => query_pragma( PragmaName::JournalMode, @@ -105,7 +99,7 @@ fn update_pragma( connection, program, ), - PragmaName::LegacyFileFormat => Ok(program), + PragmaName::LegacyFileFormat => Ok((program, TransactionMode::None)), PragmaName::WalCheckpoint => query_pragma( PragmaName::WalCheckpoint, schema, @@ -136,7 +130,7 @@ fn update_pragma( value: version_value, p5: 1, }); - Ok(program) + Ok((program, TransactionMode::Write)) } PragmaName::SchemaVersion => { // TODO: Implement updating schema_version @@ -155,7 +149,7 @@ fn update_pragma( _ => bail_parse_error!("Invalid value for page size pragma"), }; update_page_size(connection, page_size as u32)?; - Ok(program) + Ok((program, TransactionMode::None)) } PragmaName::AutoVacuum => { let auto_vacuum_mode = match value { @@ -211,7 +205,7 @@ fn update_pragma( value: auto_vacuum_mode - 1, p5: 0, }); - Ok(program) + Ok((program, TransactionMode::None)) } PragmaName::IntegrityCheck => unreachable!("integrity_check cannot be set"), PragmaName::UnstableCaptureDataChangesConn => { @@ -236,7 +230,7 @@ fn update_pragma( )?; } connection.set_capture_data_changes(opts); - Ok(program) + Ok((program, TransactionMode::Write)) } } } @@ -248,20 +242,22 @@ fn query_pragma( pager: Rc, connection: Arc, mut program: ProgramBuilder, -) -> crate::Result { +) -> crate::Result<(ProgramBuilder, TransactionMode)> { let register = program.alloc_register(); match pragma { PragmaName::CacheSize => { program.emit_int(connection.get_cache_size() as i64, register); program.emit_result_row(register, 1); program.add_pragma_result_column(pragma.to_string()); + Ok((program, TransactionMode::None)) } PragmaName::JournalMode => { program.emit_string8("wal".into(), register); program.emit_result_row(register, 1); program.add_pragma_result_column(pragma.to_string()); + Ok((program, TransactionMode::None)) } - PragmaName::LegacyFileFormat => {} + PragmaName::LegacyFileFormat => Ok((program, TransactionMode::None)), PragmaName::WalCheckpoint => { // Checkpoint uses 3 registers: P1, P2, P3. Ref Insn::Checkpoint for more info. // Allocate two more here as one was allocated at the top. @@ -288,6 +284,7 @@ fn query_pragma( dest: register, }); program.emit_result_row(register, 3); + Ok((program, TransactionMode::None)) } PragmaName::PageCount => { program.emit_insn(Insn::PageCount { @@ -296,6 +293,7 @@ fn query_pragma( }); program.emit_result_row(register, 1); program.add_pragma_result_column(pragma.to_string()); + Ok((program, TransactionMode::Read)) } PragmaName::TableInfo => { let table = match value { @@ -341,6 +339,7 @@ fn query_pragma( for name in col_names { program.add_pragma_result_column(name.into()); } + Ok((program, TransactionMode::None)) } PragmaName::UserVersion => { program.emit_insn(Insn::ReadCookie { @@ -350,6 +349,7 @@ fn query_pragma( }); program.add_pragma_result_column(pragma.to_string()); program.emit_result_row(register, 1); + Ok((program, TransactionMode::Read)) } PragmaName::SchemaVersion => { program.emit_insn(Insn::ReadCookie { @@ -359,6 +359,7 @@ fn query_pragma( }); program.add_pragma_result_column(pragma.to_string()); program.emit_result_row(register, 1); + Ok((program, TransactionMode::Read)) } PragmaName::PageSize => { program.emit_int( @@ -367,6 +368,7 @@ fn query_pragma( ); program.emit_result_row(register, 1); program.add_pragma_result_column(pragma.to_string()); + Ok((program, TransactionMode::None)) } PragmaName::AutoVacuum => { let auto_vacuum_mode = pager.get_auto_vacuum_mode(); @@ -383,9 +385,11 @@ fn query_pragma( value: auto_vacuum_mode_i64, }); program.emit_result_row(register, 1); + Ok((program, TransactionMode::None)) } PragmaName::IntegrityCheck => { translate_integrity_check(schema, &mut program)?; + Ok((program, TransactionMode::Read)) } PragmaName::UnstableCaptureDataChangesConn => { let pragma = pragma_for(pragma); @@ -400,10 +404,9 @@ fn query_pragma( program.emit_result_row(register, 2); program.add_pragma_result_column(pragma.columns[0].to_string()); program.add_pragma_result_column(pragma.columns[1].to_string()); + Ok((program, TransactionMode::Read)) } } - - Ok(program) } fn update_auto_vacuum_mode(