From 5707efd23202226bccdd1c0298a36cb97b41e193 Mon Sep 17 00:00:00 2001 From: gwenn Date: Mon, 12 Jun 2023 19:16:10 +0200 Subject: [PATCH 1/3] Savepoint Drop bug See https://github.com/rusqlite/rusqlite/pull/1327#issuecomment-1586618034 --- src/transaction.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/transaction.rs b/src/transaction.rs index 122371f..2b6f5ac 100644 --- a/src/transaction.rs +++ b/src/transaction.rs @@ -686,6 +686,22 @@ mod test { Ok(()) } + #[test] + fn test_savepoint_release_error() -> Result<()> { + let mut db = checked_memory_handle()?; + + db.pragma_update(None, "foreign_keys", true)?; + db.execute_batch("CREATE TABLE r(n INTEGER PRIMARY KEY NOT NULL); CREATE TABLE f(n REFERENCES r(n) DEFERRABLE INITIALLY DEFERRED);")?; + { + let mut sp = db.savepoint()?; + sp.execute("INSERT INTO f VALUES (0)", [])?; + sp.set_drop_behavior(DropBehavior::Commit); + } + assert!(db.is_autocommit()); + + Ok(()) + } + #[test] fn test_savepoint_names() -> Result<()> { let mut db = checked_memory_handle()?; From 3e9e7fdc186df0ae7b0cb3766ee33b80dc03e6a7 Mon Sep 17 00:00:00 2001 From: gwenn Date: Mon, 12 Jun 2023 19:23:06 +0200 Subject: [PATCH 2/3] Fix Savepoint::drop --- src/transaction.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transaction.rs b/src/transaction.rs index 2b6f5ac..6e3f2f9 100644 --- a/src/transaction.rs +++ b/src/transaction.rs @@ -344,7 +344,7 @@ impl Savepoint<'_> { return Ok(()); } match self.drop_behavior() { - DropBehavior::Commit => self.commit_().or_else(|_| self.rollback()), + DropBehavior::Commit => self.commit_().or_else(|_| self.rollback().and_then(|_| self.commit_())), DropBehavior::Rollback => self.rollback().and_then(|_| self.commit_()), DropBehavior::Ignore => Ok(()), DropBehavior::Panic => panic!("Savepoint dropped unexpectedly."), From c24eca2eea421b0ef15f133341b1d02e2882d93a Mon Sep 17 00:00:00 2001 From: gwenn Date: Mon, 12 Jun 2023 19:25:55 +0200 Subject: [PATCH 3/3] Rustfmt --- src/transaction.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/transaction.rs b/src/transaction.rs index 6e3f2f9..352b89c 100644 --- a/src/transaction.rs +++ b/src/transaction.rs @@ -344,7 +344,9 @@ impl Savepoint<'_> { return Ok(()); } match self.drop_behavior() { - DropBehavior::Commit => self.commit_().or_else(|_| self.rollback().and_then(|_| self.commit_())), + DropBehavior::Commit => self + .commit_() + .or_else(|_| self.rollback().and_then(|_| self.commit_())), DropBehavior::Rollback => self.rollback().and_then(|_| self.commit_()), DropBehavior::Ignore => Ok(()), DropBehavior::Panic => panic!("Savepoint dropped unexpectedly."),