diff --git a/src/lib.rs b/src/lib.rs index 8a7fdc9..9a3e030 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -496,7 +496,9 @@ async fn execute(cursor: &Cursor, sql: String, parameters: Option<&PyTuple>) -> Some(parameters) => { let mut params = vec![]; for param in parameters.iter() { - let param = if let Ok(value) = param.extract::() { + let param = if param.is_none() { + libsql_core::Value::Null + } else if let Ok(value) = param.extract::() { libsql_core::Value::Integer(value as i64) } else if let Ok(value) = param.extract::() { libsql_core::Value::Real(value) diff --git a/tests/test_suite.py b/tests/test_suite.py index d3f1ffc..eda5203 100644 --- a/tests/test_suite.py +++ b/tests/test_suite.py @@ -238,6 +238,17 @@ def test_params(provider): res = cur.execute("SELECT * FROM users") assert (1, "alice@example.com") == res.fetchone() +@pytest.mark.parametrize("provider", ["libsql", "sqlite"]) +def test_none_param(provider): + conn = connect(provider, ":memory:") + cur = conn.cursor() + cur.execute("CREATE TABLE users (id INTEGER, email TEXT)") + cur.execute("INSERT INTO users VALUES (?, ?)", (1, None)) + cur.execute("INSERT INTO users VALUES (?, ?)", (2, "alice@example.com")) + res = cur.execute("SELECT * FROM users ORDER BY id") + results = res.fetchall() + assert results[0] == (1, None) + assert results[1] == (2, "alice@example.com") @pytest.mark.parametrize("provider", ["libsql", "sqlite"]) def test_fetchmany(provider):