From 878e7267016ba25d05d8736349fb897c756f311d Mon Sep 17 00:00:00 2001 From: Erlend Egeberg Aasland Date: Sat, 21 Aug 2021 20:58:58 +0200 Subject: bpo-44965: Early exit for non-DML statements in sqlite3.Cursor.executemany() (GH-27865) --- Modules/_sqlite/cursor.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 7308f30..e418caf 100644 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -548,6 +548,13 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation goto error; } + pysqlite_state *state = self->connection->state; + if (multiple && sqlite3_stmt_readonly(self->statement->st)) { + PyErr_SetString(state->ProgrammingError, + "executemany() can only execute DML statements."); + goto error; + } + if (self->statement->in_use) { Py_SETREF(self->statement, pysqlite_statement_create(self->connection, operation)); @@ -570,7 +577,6 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation } } - pysqlite_state *state = self->connection->state; while (1) { parameters = PyIter_Next(parameters_iter); if (!parameters) { @@ -653,13 +659,6 @@ _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* operation } if (rc == SQLITE_ROW) { - if (multiple) { - PyErr_SetString(state->ProgrammingError, - "executemany() can only execute DML " - "statements."); - goto error; - } - self->next_row = _pysqlite_fetch_one_row(self); if (self->next_row == NULL) goto error; -- cgit v0.12