From e2ab6736249808cbfdac0ea772098d2502f2ebdf Mon Sep 17 00:00:00 2001 From: meteorgan Date: Fri, 11 Jul 2025 17:54:35 +0800 Subject: [PATCH] fix self.pager.replace() panic --- core/lib.rs | 30 +++++++++++------------------- core/translate/pragma.rs | 2 +- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/core/lib.rs b/core/lib.rs index 1aa636c23..12d758005 100644 --- a/core/lib.rs +++ b/core/lib.rs @@ -540,22 +540,19 @@ impl Connection { .unwrap() .trim(); self.maybe_update_schema(); + let pager = self.pager.borrow().clone(); match cmd { Cmd::Stmt(stmt) => { let program = Rc::new(translate::translate( self.schema.borrow().deref(), stmt, - self.pager.borrow().clone(), + pager.clone(), self.clone(), &syms, QueryMode::Normal, input, )?); - Ok(Statement::new( - program, - self._db.mv_store.clone(), - self.pager.borrow().clone(), - )) + Ok(Statement::new(program, self._db.mv_store.clone(), pager)) } Cmd::Explain(_stmt) => todo!(), Cmd::ExplainQueryPlan(_stmt) => todo!(), @@ -591,22 +588,19 @@ impl Connection { return Err(LimboError::InternalError("Connection closed".to_string())); } let syms = self.syms.borrow(); + let pager = self.pager.borrow().clone(); match cmd { Cmd::Stmt(ref stmt) | Cmd::Explain(ref stmt) => { let program = translate::translate( self.schema.borrow().deref(), stmt.clone(), - self.pager.borrow().clone(), + pager.clone(), self.clone(), &syms, cmd.into(), input, )?; - let stmt = Statement::new( - program.into(), - self._db.mv_store.clone(), - self.pager.borrow().clone(), - ); + let stmt = Statement::new(program.into(), self._db.mv_store.clone(), pager); Ok(Some(stmt)) } Cmd::ExplainQueryPlan(stmt) => { @@ -646,6 +640,7 @@ impl Connection { let mut parser = Parser::new(sql.as_bytes()); while let Some(cmd) = parser.next()? { let syms = self.syms.borrow(); + let pager = self.pager.borrow().clone(); let byte_offset_end = parser.offset(); let input = str::from_utf8(&sql.as_bytes()[..byte_offset_end]) .unwrap() @@ -656,7 +651,7 @@ impl Connection { let program = translate::translate( self.schema.borrow().deref(), stmt, - self.pager.borrow().clone(), + pager, self.clone(), &syms, QueryMode::Explain, @@ -669,7 +664,7 @@ impl Connection { let program = translate::translate( self.schema.borrow().deref(), stmt, - self.pager.borrow().clone(), + pager.clone(), self.clone(), &syms, QueryMode::Normal, @@ -679,11 +674,8 @@ impl Connection { let mut state = vdbe::ProgramState::new(program.max_registers, program.cursor_ref.len()); loop { - let res = program.step( - &mut state, - self._db.mv_store.clone(), - self.pager.borrow().clone(), - )?; + let res = + program.step(&mut state, self._db.mv_store.clone(), pager.clone())?; if matches!(res, StepResult::Done) { break; } diff --git a/core/translate/pragma.rs b/core/translate/pragma.rs index 0680f53dc..d6736ef95 100644 --- a/core/translate/pragma.rs +++ b/core/translate/pragma.rs @@ -30,7 +30,7 @@ fn list_pragmas(program: &mut ProgramBuilder) { program.emit_result_row(register, 1); } program.add_pragma_result_column("pragma_list".into()); - program.epilogue(crate::translate::emitter::TransactionMode::None); + program.epilogue(TransactionMode::None); } #[allow(clippy::too_many_arguments)]