Skip to content

Commit a14dd59

Browse files
authored
fix(sqlite): Raise ProgrammingError when operating on a closed cursor (RustPython#6339)
1 parent cb7450d commit a14dd59

File tree

2 files changed

+9
-9
lines changed

2 files changed

+9
-9
lines changed

Lib/test/test_sqlite3/test_dbapi.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1735,8 +1735,6 @@ def test_closed_call(self):
17351735
con()
17361736

17371737
class ClosedCurTests(unittest.TestCase):
1738-
# TODO: RUSTPYTHON
1739-
@unittest.expectedFailure
17401738
def test_closed(self):
17411739
con = sqlite.connect(":memory:")
17421740
cur = con.cursor()

crates/stdlib/src/sqlite.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1771,6 +1771,8 @@ mod _sqlite {
17711771
script: PyUtf8StrRef,
17721772
vm: &VirtualMachine,
17731773
) -> PyResult<PyRef<Self>> {
1774+
let _ = zelf.clone().inner(vm)?;
1775+
17741776
let db = zelf.connection.db_lock(vm)?;
17751777

17761778
db.sql_limit(script.byte_len(), vm)?;
@@ -1829,19 +1831,19 @@ mod _sqlite {
18291831
fn close(&self, vm: &VirtualMachine) -> PyResult<()> {
18301832
// Check if __init__ was called
18311833
let mut guard = self.inner.lock();
1832-
if guard.is_none() {
1834+
1835+
let Some(inner) = guard.as_mut() else {
18331836
return Err(new_programming_error(
18341837
vm,
18351838
"Base Cursor.__init__ not called.".to_owned(),
18361839
));
1837-
}
1840+
};
18381841

1839-
if let Some(inner) = guard.as_mut() {
1840-
if let Some(stmt) = &inner.statement {
1841-
stmt.lock().reset();
1842-
}
1843-
inner.closed = true;
1842+
if let Some(stmt) = &inner.statement {
1843+
stmt.lock().reset();
18441844
}
1845+
inner.closed = true;
1846+
18451847
Ok(())
18461848
}
18471849

0 commit comments

Comments
 (0)