From: Erlend Egeberg Aasland Date: Sat, 21 Aug 2021 18:58:58 +0000 (+0200) Subject: bpo-44965: Early exit for non-DML statements in sqlite3.Cursor.executemany() (GH... X-Git-Tag: v3.11.0a1~375 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=878e7267016ba25d05d8736349fb897c756f311d;p=thirdparty%2FPython%2Fcpython.git bpo-44965: Early exit for non-DML statements in sqlite3.Cursor.executemany() (GH-27865) --- diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c index 7308f3062da4..e418cafb4feb 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;