Skip to content

Commit 74d33d1

Browse files
committed
Fix Cursor.execute() for blob bind parameters
Fixes #69
1 parent 1786567 commit 74d33d1

File tree

2 files changed

+20
-10
lines changed

2 files changed

+20
-10
lines changed

src/lib.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -406,16 +406,17 @@ async fn execute(cursor: &Cursor, sql: String, parameters: Option<&PyTuple>) ->
406406
let params = match parameters {
407407
Some(parameters) => {
408408
let mut params = vec![];
409-
for parameter in parameters.iter() {
410-
let param = match parameter.extract::<i32>() {
411-
Ok(value) => libsql_core::Value::Integer(value as i64),
412-
Err(_) => match parameter.extract::<f64>() {
413-
Ok(value) => libsql_core::Value::Real(value),
414-
Err(_) => match parameter.extract::<&str>() {
415-
Ok(value) => libsql_core::Value::Text(value.to_string()),
416-
Err(_) => todo!(),
417-
},
418-
},
409+
for param in parameters.iter() {
410+
let param = if let Ok(value) = param.extract::<i32>() {
411+
libsql_core::Value::Integer(value as i64)
412+
} else if let Ok(value) = param.extract::<f64>() {
413+
libsql_core::Value::Real(value)
414+
} else if let Ok(value) = param.extract::<&str>() {
415+
libsql_core::Value::Text(value.to_string())
416+
} else if let Ok(value) = param.extract::<&[u8]>() {
417+
libsql_core::Value::Blob(value.to_vec())
418+
} else {
419+
return Err(PyValueError::new_err("Unsupported parameter type"));
419420
};
420421
params.push(param);
421422
}

tests/test_suite.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,15 @@ def test_cursor_fetchmany(provider):
6666
assert [(5, 'erin@example.com')] == res.fetchmany(2)
6767
assert [] == res.fetchmany(2)
6868

69+
@pytest.mark.parametrize("provider", ["sqlite", "libsql"])
70+
def test_cursor_execute_blob(provider):
71+
conn = connect(provider, ":memory:")
72+
cur = conn.cursor()
73+
cur.execute("CREATE TABLE users (id INTEGER, data BLOB)")
74+
cur.execute("INSERT INTO users VALUES (?, ?)", (1, b'foobar'))
75+
res = cur.execute("SELECT * FROM users")
76+
assert (1, b'foobar') == res.fetchone()
77+
6978
@pytest.mark.parametrize("provider", ["libsql", "sqlite"])
7079
def test_cursor_executemany(provider):
7180
conn = connect(provider, ":memory:")

0 commit comments

Comments
 (0)