]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-45512: Raise exception if sqlite3.Connection.__init__ is called with bad isolatio...
authorErlend Egeberg Aasland <erlend.aasland@innova.no>
Mon, 15 Nov 2021 12:55:38 +0000 (13:55 +0100)
committerGitHub <noreply@github.com>
Mon, 15 Nov 2021 12:55:38 +0000 (21:55 +0900)
* bpo-45512: Raise sqlite3.Connection.__init__ is called with bad isolation level

* Also explicitly test allowed isolation levels

* Use subTest for better error messages if something goes wrong

* Update Lib/test/test_sqlite3/test_dbapi.py

Co-authored-by: Dong-hee Na <donghee.na92@gmail.com>
Co-authored-by: Dong-hee Na <donghee.na92@gmail.com>
Lib/test/test_sqlite3/test_dbapi.py
Modules/_sqlite/connection.c

index a5ec66fe22a2a725f0e1c312ef3ad4393119a537..802a6919371f9dad26f133bbde43352ad77840f8 100644 (file)
@@ -48,8 +48,8 @@ def managed_connect(*args, in_mem=False, **kwargs):
 
 
 # Helper for temporary memory databases
-def memory_database():
-    cx = sqlite.connect(":memory:")
+def memory_database(*args, **kwargs):
+    cx = sqlite.connect(":memory:", *args, **kwargs)
     return contextlib.closing(cx)
 
 
@@ -509,6 +509,20 @@ class ConnectionTests(unittest.TestCase):
         self.assertRaisesRegex(sqlite.ProgrammingError, msg,
                                self.cx.setlimit, cat, 0)
 
+    def test_connection_init_bad_isolation_level(self):
+        msg = (
+            "isolation_level string must be '', 'DEFERRED', 'IMMEDIATE', or "
+            "'EXCLUSIVE'"
+        )
+        with self.assertRaisesRegex(ValueError, msg):
+            memory_database(isolation_level="BOGUS")
+
+    def test_connection_init_good_isolation_levels(self):
+        for level in ("", "DEFERRED", "IMMEDIATE", "EXCLUSIVE", None):
+            with self.subTest(level=level):
+                with memory_database(isolation_level=level) as cx:
+                    cx.execute("select 'ok'")
+
 
 class UninitialisedConnectionTests(unittest.TestCase):
     def setUp(self):
index e4f0013ae604e45693887549899fce201199b4fd..b902dc845c61886b0b1d58a700221e61c1f6eda0 100644 (file)
@@ -127,6 +127,9 @@ get_begin_statement(const char *level)
             return begin_statements[i];
         }
     }
+    PyErr_SetString(PyExc_ValueError,
+                    "isolation_level string must be '', 'DEFERRED', "
+                    "'IMMEDIATE', or 'EXCLUSIVE'");
     return NULL;
 }
 
@@ -1389,9 +1392,6 @@ pysqlite_connection_set_isolation_level(pysqlite_Connection* self, PyObject* iso
         }
         const char *stmt = get_begin_statement(cstr_level);
         if (stmt == NULL) {
-            PyErr_SetString(PyExc_ValueError,
-                            "isolation_level string must be '', 'DEFERRED', "
-                            "'IMMEDIATE', or 'EXCLUSIVE'");
             return -1;
         }
         self->begin_statement = stmt;