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

pablogsal webhook-mailer at python.org
Sat Aug 21 14:59:03 EDT 2021


https://github.com/python/cpython/commit/878e7267016ba25d05d8736349fb897c756f311d
commit: 878e7267016ba25d05d8736349fb897c756f311d
branch: main
author: Erlend Egeberg Aasland <erlend.aasland at innova.no>
committer: pablogsal <Pablogsal at gmail.com>
date: 2021-08-21T19:58:58+01:00
summary:

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

files:
M Modules/_sqlite/cursor.c

diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c
index 7308f3062da4b9..e418cafb4feb60 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;



More information about the Python-checkins mailing list