From f63a71ad9b9838b880232a12ec85b1ed2afa9287 Mon Sep 17 00:00:00 2001 From: Jamie Barton Date: Wed, 30 Oct 2024 10:13:15 +0000 Subject: [PATCH 1/4] feat: accept None as a param type --- src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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) From 093e812f293ec771d33213a55c3f52ce447bcf7d Mon Sep 17 00:00:00 2001 From: Jamie Barton Date: Wed, 30 Oct 2024 10:39:48 +0000 Subject: [PATCH 2/4] add test --- tests/test_suite.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/test_suite.py b/tests/test_suite.py index d3f1ffc..aa280e5 100644 --- a/tests/test_suite.py +++ b/tests/test_suite.py @@ -238,6 +238,16 @@ def test_params(provider): res = cur.execute("SELECT * FROM users") assert (1, "alice@example.com") == res.fetchone() +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 (?, ?)", (1, "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): From 6dde130020519780c0e19ca580b263efd038ccb2 Mon Sep 17 00:00:00 2001 From: Jamie Barton Date: Wed, 30 Oct 2024 11:43:53 +0000 Subject: [PATCH 3/4] fix: provider for None --- tests/test_suite.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_suite.py b/tests/test_suite.py index aa280e5..8f9f115 100644 --- a/tests/test_suite.py +++ b/tests/test_suite.py @@ -238,6 +238,7 @@ 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() From d01208dcb9d2f18a9d7e7a1e8e075ad9e39e6a24 Mon Sep 17 00:00:00 2001 From: Jamie Barton Date: Wed, 30 Oct 2024 11:48:03 +0000 Subject: [PATCH 4/4] fix: use id 2 --- tests/test_suite.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_suite.py b/tests/test_suite.py index 8f9f115..eda5203 100644 --- a/tests/test_suite.py +++ b/tests/test_suite.py @@ -244,7 +244,7 @@ def test_none_param(provider): 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 (?, ?)", (1, "alice@example.com")) + 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)