summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS4
-rw-r--r--Modules/_sqlite/cursor.c2
-rw-r--r--Modules/_sqlite/statement.c4
3 files changed, 10 insertions, 0 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index aca06f2..a31bcd5 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -151,6 +151,10 @@ Extension Modules
- Issue #3103: Reduced globals symbols used by sqlite3 module and made sure all
remaining ones have "pysqlite_" prefix.
+- Issue #3846: Release the GIL during sqlite3_prepare calls. This improves
+ concurrent access to the same SQLite database from multiple
+ threads/processes.
+
Tests
-----
diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c
index 1bf27d7..6572a559 100644
--- a/Modules/_sqlite/cursor.c
+++ b/Modules/_sqlite/cursor.c
@@ -790,11 +790,13 @@ PyObject* pysqlite_cursor_executescript(pysqlite_Cursor* self, PyObject* args)
}
statement_completed = 1;
+ Py_BEGIN_ALLOW_THREADS
rc = sqlite3_prepare(self->connection->db,
script_cstr,
-1,
&statement,
&script_cstr);
+ Py_END_ALLOW_THREADS
if (rc != SQLITE_OK) {
_pysqlite_seterror(self->connection->db, NULL);
goto error;
diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c
index dae83d4..f200c56 100644
--- a/Modules/_sqlite/statement.c
+++ b/Modules/_sqlite/statement.c
@@ -79,11 +79,13 @@ int pysqlite_statement_create(pysqlite_Statement* self, pysqlite_Connection* con
sql_cstr = PyString_AsString(sql_str);
+ Py_BEGIN_ALLOW_THREADS
rc = sqlite3_prepare(connection->db,
sql_cstr,
-1,
&self->st,
&tail);
+ Py_END_ALLOW_THREADS
self->db = connection->db;
@@ -328,11 +330,13 @@ int pysqlite_statement_recompile(pysqlite_Statement* self, PyObject* params)
sql_cstr = PyString_AsString(self->sql);
+ Py_BEGIN_ALLOW_THREADS
rc = sqlite3_prepare(self->db,
sql_cstr,
-1,
&new_st,
&tail);
+ Py_END_ALLOW_THREADS
if (rc == SQLITE_OK) {
/* The efficient sqlite3_transfer_bindings is only available in SQLite