From f5c85aa3eea1adf0c61089583e2251282a316ec1 Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Mon, 27 Jun 2022 09:58:56 +0200 Subject: [PATCH] gh-88239: Use sqlite3_stmt_busy() to determine if statements are in use (#25984) --- Modules/_sqlite/cursor.c | 19 +++---------------- Modules/_sqlite/statement.c | 1 - Modules/_sqlite/statement.h | 1 - 3 files changed, 3 insertions(+), 18 deletions(-) diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 8d9f20da530..cbf4718365f 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -130,14 +130,10 @@ stmt_reset(pysqlite_Statement *self) { int rc = SQLITE_OK; - if (self->in_use && self->st) { + if (self->st != NULL) { Py_BEGIN_ALLOW_THREADS rc = sqlite3_reset(self->st); Py_END_ALLOW_THREADS - - if (rc == SQLITE_OK) { - self->in_use = 0; - } } return rc; @@ -770,12 +766,6 @@ bind_parameters(pysqlite_state *state, pysqlite_Statement *self, } } -static inline void -stmt_mark_dirty(pysqlite_Statement *self) -{ - self->in_use = 1; -} - PyObject * _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation, PyObject* second_argument) { @@ -852,7 +842,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation goto error; } - if (self->statement->in_use) { + if (sqlite3_stmt_busy(self->statement->st)) { Py_SETREF(self->statement, pysqlite_statement_create(self->connection, operation)); if (self->statement == NULL) { @@ -860,8 +850,7 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation } } - stmt_reset(self->statement); - stmt_mark_dirty(self->statement); + (void)stmt_reset(self->statement); self->rowcount = self->statement->is_dml ? 0L : -1L; /* We start a transaction implicitly before a DML statement. @@ -882,8 +871,6 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation break; } - stmt_mark_dirty(self->statement); - bind_parameters(state, self->statement, parameters); if (PyErr_Occurred()) { goto error; diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c index aee460747b4..229bfc3b504 100644 --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -88,7 +88,6 @@ pysqlite_statement_create(pysqlite_Connection *connection, PyObject *sql) } self->st = stmt; - self->in_use = 0; self->is_dml = is_dml; PyObject_GC_Track(self); diff --git a/Modules/_sqlite/statement.h b/Modules/_sqlite/statement.h index 5e61227424b..11a6464b1a1 100644 --- a/Modules/_sqlite/statement.h +++ b/Modules/_sqlite/statement.h @@ -33,7 +33,6 @@ typedef struct { PyObject_HEAD sqlite3_stmt* st; - int in_use; int is_dml; } pysqlite_Statement;