diff --git a/src/cache.rs b/src/cache.rs index f85c3ab..67ecd24 100644 --- a/src/cache.rs +++ b/src/cache.rs @@ -84,7 +84,7 @@ impl Drop for CachedStatement<'_> { #[allow(unused_must_use)] fn drop(&mut self) { if let Some(stmt) = self.stmt.take() { - self.cache.cache_stmt(stmt.into()); + self.cache.cache_stmt(unsafe { stmt.into_raw() }); } } } diff --git a/src/statement.rs b/src/statement.rs index 92a4bf6..68d39da 100644 --- a/src/statement.rs +++ b/src/statement.rs @@ -702,11 +702,12 @@ impl Statement<'_> { pub(crate) fn check_no_tail(&self) -> Result<()> { Ok(()) } -} -impl Into for Statement<'_> { - fn into(mut self) -> RawStatement { - let mut stmt = unsafe { RawStatement::new(ptr::null_mut(), false) }; + /// Safety: This is unsafe, because using `sqlite3_stmt` after the + /// connection has closed is illegal, but `RawStatement` does not enforce + /// this, as it loses our protective `'conn` lifetime bound. + pub(crate) unsafe fn into_raw(mut self) -> RawStatement { + let mut stmt = RawStatement::new(ptr::null_mut(), false); mem::swap(&mut stmt, &mut self.stmt); stmt }