Skip to content

Commit e909e32

Browse files
authored
sqlite: Fix missing ProgrammingError for parameter mismatch (RustPython#6104)
1 parent 9417e10 commit e909e32

File tree

2 files changed

+20
-9
lines changed

2 files changed

+20
-9
lines changed

Lib/test/test_sqlite3/test_dbapi.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -836,15 +836,11 @@ def test_execute_wrong_no_of_args1(self):
836836
with self.assertRaises(sqlite.ProgrammingError):
837837
self.cu.execute("insert into test(id) values (?)", (17, "Egon"))
838838

839-
# TODO: RUSTPYTHON
840-
@unittest.expectedFailure
841839
def test_execute_wrong_no_of_args2(self):
842840
# too little parameters
843841
with self.assertRaises(sqlite.ProgrammingError):
844842
self.cu.execute("insert into test(id) values (?)")
845843

846-
# TODO: RUSTPYTHON
847-
@unittest.expectedFailure
848844
def test_execute_wrong_no_of_args3(self):
849845
# no parameters, parameters are needed
850846
with self.assertRaises(sqlite.ProgrammingError):
@@ -911,8 +907,6 @@ def test_execute_dict_mapping_too_little_args(self):
911907
with self.assertRaises(sqlite.ProgrammingError):
912908
self.cu.execute("select name from test where name=:name and id=:id", {"name": "foo"})
913909

914-
# TODO: RUSTPYTHON
915-
@unittest.expectedFailure
916910
def test_execute_dict_mapping_no_args(self):
917911
self.cu.execute("insert into test(name) values ('foo')")
918912
with self.assertRaises(sqlite.ProgrammingError):

stdlib/src/sqlite.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1533,8 +1533,16 @@ mod _sqlite {
15331533
}
15341534

15351535
let st = stmt.lock();
1536+
let params_needed = st.bind_parameter_count();
1537+
15361538
if let OptionalArg::Present(parameters) = parameters {
15371539
st.bind_parameters(&parameters, vm)?;
1540+
} else if params_needed > 0 {
1541+
let msg = format!(
1542+
"Incorrect number of bindings supplied. The current statement uses {}, and 0 were supplied.",
1543+
params_needed
1544+
);
1545+
return Err(new_programming_error(vm, msg));
15381546
}
15391547

15401548
let ret = st.step();
@@ -2848,16 +2856,25 @@ mod _sqlite {
28482856
Ok(())
28492857
}
28502858

2859+
fn bind_parameter_count(self) -> c_int {
2860+
unsafe { sqlite3_bind_parameter_count(self.st) }
2861+
}
2862+
28512863
fn bind_parameters_sequence(
28522864
self,
28532865
seq: PySequence<'_>,
28542866
vm: &VirtualMachine,
28552867
) -> PyResult<()> {
2856-
let num_needed = unsafe { sqlite3_bind_parameter_count(self.st) };
2857-
if seq.length(vm)? != num_needed as usize {
2868+
let num_needed = self.bind_parameter_count();
2869+
let num_supplied = seq.length(vm)?;
2870+
2871+
if num_supplied != num_needed as usize {
28582872
return Err(new_programming_error(
28592873
vm,
2860-
"Incorrect number of binding supplied".to_owned(),
2874+
format!(
2875+
"Incorrect number of bindings supplied. The current statement uses {}, and {} were supplied.",
2876+
num_needed, num_supplied
2877+
),
28612878
));
28622879
}
28632880

0 commit comments

Comments
 (0)