bpo-44965: Early exit for non-DML statements in sqlite3.Cursor.executemany() (GH-27865)

This commit is contained in:
Erlend Egeberg Aasland 2021-08-21 20:58:58 +02:00 committed by GitHub
parent 4ceec49559
commit 878e726701
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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;